我正在尝试使用scrapy,xpath和regex来刮擦website。 我已经检查并尝试了此问题的答案: xpath+ regex: matches text
我想创建一个<p>
的'scrapy.selector.unified.SelectorList',其中包含文本“ 11(sun)”或“ 9(fri)”等,并循环浏览列表。 / p>
event = response.xpath('//p[matches(text(), "\d+\s\(\w{3}\)")]').extract()
不起作用。
仅供参考,下面的方法确实有效。
event = response.xpath('//p[contains(text(), "11 (sun)")]').extract()
我在这里想念什么?
答案 0 :(得分:1)
您可以使用re()
代替extract()
对该列表中的每个元素调用.re()方法,并将其结果展平,作为Unicode字符串列表返回。
.re()返回unicode字符串的列表。因此,您无法构造嵌套的.re()调用。
event = response.xpath('//p/text()').extract("\d+\s\(\w{3}\)")
注意:re()解码HTML实体(<和&除外)。
有关更多信息,请参阅此处的文档:https://doc.scrapy.org/en/latest/topics/selectors.html#scrapy.selector.SelectorList.re
答案 1 :(得分:0)
如果您只想输入文字,Karan Verma的答案就足够了。
如果您喜欢元素本身,请继续阅读。
matches
仅在XPath 2.0和更高版本中可用(与其他正则表达式函数一样),在scrapy中不可用。
Scrapy使用parsel进行解析,而parsel则使用仅支持XPath 1.0的lxml。 但是,它确实支持regular expressions in the EXSLT namespace
由于regex命名空间默认是在scrapy中启用的,所以您可以这样做:
event = response.xpath('//p[re:match(text(), "\d+\s\(\w{3}\)")]')