【发布时间】:2019-05-22 14:28:13
【问题描述】:
我正在尝试提取参考。带有scrapy的HTML中的ID:
<div class="col" itemprop="description">
<p>text Ref. <span>220.20.34.20.53.001</span></p>
<p>more text</p>
</div>
span 和 p 标签并不总是存在。
使用 xpath 选择器:
text = ' '.join(response.xpath('//div[@itemprop="description"]/p/text()').extract()).replace(u'\xa0', u' ')
try:
ref_id = re.findall(r"Ref\.? ?((?:[A-Z\d\.]+)|(?:[\d.]+))", text)[0].strip()
在这种情况下只返回一个空字符串,因为标签内有 HTML。
现在尝试使用 CSS 选择器提取文本以使用 remove_tags:
>>> ''.join([remove_tags(w).strip()for w in response.css('div[itemprop="description"]::text').extract()])
这会返回一个空结果,因为我无法获取该项目。
无论是否在 div 中包含 html <p> 标签,我如何提取 ref_id。爬取的某些项目没有<p> 标签,也没有<span>,这是我第一次尝试使用xpath 的地方。
【问题讨论】:
-
我假设你知道著名的RegEx match open tags except XHTML self-contained tags?你为什么不使用 BeautifulSoup?
-
不,没见过那个。我认为scrapy不需要漂亮的汤,因为它可以使用内置的css和xpath选择器处理这样的任务?
-
可能(我对这个库不是很熟悉),但你很清楚地将正则表达式模块混入其中。
-
是的,一旦我从 div 中获得了文本,我将使用正则表达式从文本中提取 ref id。这适用于 90% 的情况,除了文本中有附加 标记的情况。
-
这正是我链接的答案在一般情况下试图说明的内容;不要在 HTML 上使用正则表达式,使用 HTML 解析器 :)