我使用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')
为什么我没有收到字符串?
答案 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']
希望这有帮助。