如何获取包含与正则表达式匹配的文本的<p>

时间:2018-11-21 09:37:52

标签: python regex xpath scrapy

我正在尝试使用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()

我在这里想念什么?

2 个答案:

答案 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}\)")]')