Getting attributes in PyQuery?

Richard picture Richard · Dec 28, 2012 · Viewed 13.4k times · Source

I'm using PyQuery and want to print a list of links, but can't figure out how to get the href attribute from each link in the PyQuery syntax.

This is my code:

  e = pq(url=results_url)
  links = e('li.moredetails a')
  print len(links)
  for link in links:
    print link.attr('href')

This prints 10, then gives the following error:

AttributeError: 'HtmlElement' object has no attribute 'attr'

What am I doing wrong?

Answer

Martijn Pieters picture Martijn Pieters · Dec 28, 2012

PyQuery wraps lxml, so you use the ElementTree API to access attributes:

e = pq(url=results_url)
for link in e('li.moredetails a'):
    print link.attrib['href']

Alternatively, to use the PyQuery API on any found element, wrap the element in a pq() call, echoing the way you need to use jQuery $() or jQuery() to wrap DOM elements:

    print pq(link).attr('href')

or

    print pq(link).attr['href']

for a more pythonic way to accessess the attributes.

You could also loop over the .items() method instead, which returns PyQuery elements instead:

e = pq(url=results_url)
for link in e('li.moredetails a').items():
    print link.attr['href']