使用lxml从html中提取属性

时间:2014-11-21 20:57:55

标签: python html lxml

我使用lxml从html页面检索标签的属性。 html页面的格式如下:

<div class="my_div">
    <a href="/foobar">
        <img src="my_img.png">
    </a>
</div>

我用来检索<a>标记内的网址以及同一src<img>标记的<div>值的python脚本是这样的:

from lxml import html 

...
tree = html.fromstring(page.text)
for element in tree.xpath('//div[contains(@class, "my_div")]//a'):
    href = element.xpath('/@href')
    src = element.xpath('//img/@src')

为什么我没有收到字符串?

3 个答案:

答案 0 :(得分:4)

您正在使用lxml,因此您正在使用lxml对象 - HtmlElement实例。 HtmlElement嵌套在etree.Element:http://lxml.de/api/lxml.etree._Element-class.html中, 它有 获取 方法,返回attrubute值。 所以适合你的方式是:

from lxml import html 

...
tree = html.fromstring(page.text)
for link_element in tree.xpath('//div[contains(@class, "my_div")]//a'):
    href = link_element.get('href')
    image_element = href.find('img')
    if image_element:
        img_src = image_element.get('src') 

答案 1 :(得分:0)

如果您将代码更改为:

from lxml import html 

...
tree = html.fromstring(page.text)
for element in tree.xpath('//div[contains(@class, "my_div")]//a'):
    href = element.items()[0][1]  #gives you the value corresponding to the key "href"
    src = element.xpath('//img/@src')[0]
    print(href, src)

你会得到你需要的东西。

documentation of lxml提到了其中的一些内容,但我觉得它缺少一些东西,你可能想考虑使用交互式python shell来研究tree.xpath()返回的实例的属性。或者您可以完全查看另一个解析器,例如BeautifulSoup,它具有非常好的示例和文档。只是分享......

答案 2 :(得分:0)

您没有获得所需结果的原因是您尝试从 NEXT 子项而不是现有节点获取属性。

见:

from lxml import html

s = '''<div class="my_div">
    <a href="/foobar">
        <img src="my_img.png">
    </a>
</div>'''

tree = html.fromstring(s)

# when you do path... //a, you are ALREADY at 'a' node
for el in tree.xpath('//div[contains(@class, "my_div")]//a'):
    # you were trying to get next children /@href, which doesn't exist
    print el.xpath('@href') # you should instead access the existing node's 
    print el.xpath('img/@src') # same here, not /img/@src ...

['/foobar']
['my_img.png']

希望这有帮助。