使用xpath / python

时间:2017-04-13 15:11:48

标签: python xpath

如何在此html片段中获取a的href值?

我需要根据i标签中的那个类来获取它

<!--
<a href="https://link.com" target="_blank"><i class="foobar"></i>  </a>           
-->

我试过了,但没有结果

foo_links = tree.xpath('//a[i/@class="foobar"]')

2 个答案:

答案 0 :(得分:1)

您的代码对我有用 - 它会返回<a>的列表。如果您希望href的列表不是元素本身,请添加/@href

hrefs = tree.xpath('//a[i/@class="foobar"]/@href')

您还可以先找到<i>,然后使用/parent::*(或简称/..)返回<a>

hrefs = tree.xpath('//a/i[@class="foobar"]/../@href')
#                     ^                    ^  ^
#                     |                    |  obtain the 'href'
#                     |                    |
#                     |                    get the parent of the <i>
#                     |
#                     find all <i class="foobar"> contained in an <a>.

如果所有这些都不起作用,您可能需要验证文档的结构是否正确。

请注意,XPath不会查看注释<!-- -->。如果<a>确实位于评论<!-- -->中,则需要先手动提取文档。

hrefs = [href for comment in tree.xpath('//comment()') 
              # find all comments
              for href in lxml.html.fromstring(comment.text)
              # parse content of comment as a new HTML file
                              .xpath('//a[i/@class="foobar"]/@href')
                              # read those hrefs.
]

答案 1 :(得分:0)

您应该注意目标元素是HTML 评论。您不能简单地使用<a>与<{1}}从评论获取XPath,因为在这种情况下,它不是节点,而是简单的字符串。

尝试以下代码:

"//a"

P.S。您可能需要使用更复杂的正则表达式来匹配链接import re foo_links = tree.xpath('//comment()') # get list of all comments on page for link in foo_links: if '<i class="foobar">' in link.text: href = re.search('\w+://\w+.\w+', link.text).group(0) # get href value from required comment break