再请教 lxml 分析 html 的问题,涉及 xpath 语法

2017-08-11 11:48:25 +08:00
 wencan

有如下代码:
(随便写的,不要在乎 script 节点的意义,做位置参照而已)

import lxml.html
import lxml.etree

text = '''
<html>
    <body>
        <div>
            <p>我不是你需要的文本</p>
        </div>
        <div>
            <script type="text/javascript">
                console.log("Hello world")
            </script>
            <p>我是你需要的文本</p>
        </div>
    </body>
</html>
'''

doc = lxml.html.fromstring(text)
body = doc.xpath("/html/body")[0]
divs = body.xpath("div")
for div in divs:
    scripts = div.xpath("script[@type=\"text/javascript\"]")
    if scripts is not None:
        ps = div.xpath("p")
        p = ps[0]
        print(p.text)

本意是通过 scripts is not None 匹配到第二个 div 节点,但意外的是两个 div 均匹配成功
如果输出 scripts,还都会得到 script 节点

2147 次点击
所在节点    Python
8 条回复
misaka19000
2017-08-11 11:52:35 +08:00
script 前面加个./
anguslg
2017-08-11 12:16:02 +08:00
[] != None

所以两个 p 都被选取到了
syncher
2017-08-11 12:18:23 +08:00
可以试试 xpath helper 插件
wencan
2017-08-11 12:40:59 +08:00
@anguslg
多谢
忘了 not found 返回的是[]
有个方法 not found 返回 None,结果记混淆了
mckelvin
2017-08-11 12:45:24 +08:00
wencan
2017-08-11 14:55:56 +08:00
@anguslg @misaka19000
谢谢两位
最终代码:
```
if td.xpath(".//script[@type=\"text/javascript\"]"):
pass
```
anguslg
2017-08-11 21:02:36 +08:00
@wencan 把最外面两个双引号改成单引号,可以不用写转义符号了
wencan
2017-08-12 13:02:10 +08:00
@anguslg 习惯了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382161

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX