使用以下 javascript 代码抓取页面时,我想知道分配给 myProp2 的值。
myProp1={col1: 'firstName', col2: 'lastName'};
myProp2='data';
js2xml 提供了一个 xpath(),但它不允许我执行 contains() 之类的操作,而我可以在 Scrapy 的 xpath() 中执行此操作。
我希望这样做:
xpath('//assign[contains(., "myProp2")]/right/*')
获取分配给 myProp2 的值,但我在 Scrapy 中使用的 contains() 似乎不可用。
我的解决方法是执行一次 xpath() 选择两次,然后并行迭代它们,并仅在标识符匹配后获取目标值:
import js2xml
from StringIO import StringIO
from lxml import etree
f = StringIO(
"""
<html>
<head>
<script type='text/javascript'>
myProp1={col1: 'firstName', col2: 'lastName'};
myProp2='data';
</script>
</head>
<body>
This has test javascript.
</body>
</html>
""")
tree = etree.parse(f)
for script in tree.xpath('//script/text()'):
jstree = js2xml.parse(script)
idtree = jstree.xpath('//assign/left/*')
valtree = jstree.xpath('//assign/right/*')
for ids, vals in zip(idtree, valtree):
id = js2xml.jsonlike.make_dict(ids)
val = js2xml.jsonlike.make_dict(vals)
if id == 'myProp2':
print(val)
我将在很多地方这样做,所以提供像 contains() 这样的功能的东西会很有用。
它可能以某种方式存在,我只是没有弄清楚。有没有办法在 js2xml 的 xpath() 中做到这一点?
更新:这最终成为一个基本的 xpath 表达式问题,而不是专门与 js2xml 相关的问题。
对于其他阅读本文的人来说,有这样的 xpath 初学者问题,我已经了解到有 xpath 测试器站点,它们在学习如何编写 xpath 表达式时很有帮助。