如何在lxml

时间:2019-01-03 10:11:00

标签: python-3.x xpath web-scraping lxml

这是示例HTML。

<html>
  <a href="HarryPotter:Chamber of Secrets">
    text
  </a>
  <a href="HarryPotter:Prisoners in Azkabahn">
    text
  </a>
</html>

我处于需要提取

的情况
Chamber of Secrets
Prisoners in Azkabahn 

我在使用xpathb1.0的python中使用lxml 4.2.1。 我尝试使用XPath提取

'substring-after(//a/@href,"HarryPotter:")' 

仅返回"Chamber of Secrets"

以及XPath

'//a/@href[substring-after(.,"HarryPotter:")]' 

返回

'HarryPotter:Chamber of Secrets'
'HarryPotter:Prisoners in Azkabahn'

我已经对其进行了研究并获得了新的学习,但没有找到解决问题的方法。

我使用substring-after命中并尝试了不同的XPath。

在我的研究中,我知道正则表达式也可以实现它,然后我尝试并失败了。

我发现使用regex在XPath 2.0及更高版本中操作字符串很容易,但是我们也可以在XPath 1.0中使用XSLT扩展名使用regex。

我们可以使用substring-after函数来完成此操作吗?如果是,那么XPath是什么?如果否,那么什么是获得所需输出的最佳方法?

以及如何通过坚持使用lxml在XPath中使用正则表达式来获得所需的输出。

2 个答案:

答案 0 :(得分:1)

尝试使用这种方法来获取两个文本值:

camelCase

答案 1 :(得分:0)

如果您想同时使用substring-after()substring-before()

这里是示例:

从lxml导入html

f_html = """<html><body><table><tbody><tr><td class="df9" width="20%">
         <a class="nodec1" href="javascript:reqDl(1254);" onmouseout="status='';" onmouseover="return dspSt();">
          <u>
           2014-2
          </u>
         </a>
        </td></tr></tbody></table></body></html>"""
tree_html = html.fromstring(f_html)
deal_id = tree_html.xpath("//td/a/@href")
print(tree_html.xpath('substring-after(//td/a/@href, "javascript:reqDl(")'))
print(tree_html.xpath('substring-before(//td/a/@href, ")")'))
print(tree_html.xpath('substring-after(substring-before(//td/a/@href, ")"), "javascript:reqDl(")'))

结果:

1254);
javascript:reqDl(1254
1254