您可以提取<p>标签的整个文本,然后运行正则表达式从中提取相关信息
示例代码:
import re
from scrapy.selector import Selector
html = '''<html>
<div id="product-description">
<p>
Blah blah blah text text text reads: 874620. more text text.
<br>
<br>
<b>Brand:</b>
" Nintendo"
<br>
<b>Condition:</b>
" Good"
</p>
</div>
</html>'''
extracted_text = Selector(text=html).xpath('//div[@id="product-description"]//p//text()').extract()
text = u''.join(extracted_text)
regex = r'reads:\s*(?P<reads>\d+).*Brand:\s*" (?P<brand>\w+)".*Condition:\s*" (?P<condition>\w+)"'
results = re.search(regex, text, flags=re.DOTALL).groupdict()
results['reads'] = int(results['reads'])
print(results)
此代码输出:
{'reads': 874620, 'brand': u'Nintendo', 'condition': u'Good'}
更新:
让我们看看这段代码的作用:
xpath
首先,extracted_text 使用 xpath //div[@id="product-description"]//p//text() 获取 <p> 标记内的所有文本
这个 xpath 的意思是:
- 给我所有 id 属性匹配的 div
“产品描述”
- 把上面div里面的p标签都给我
- 从这些 p 标签中获取文本
注意:// 代替 / 表示在搜索标签中还包括孩子的孩子及其孩子等等。
运行此 xpath 将为我们找到的 <p> 标记内的每个标记文本返回字符串列表。
在 xpath 之后,我们使用 u''.join(extracted_text) 将此列表连接成大字符串。
在获得我们想要的全文后,我们可以运行正则表达式来从中提取相关数据。
正则表达式
让我们尝试分解正则表达式并看看它的含义:
reads:\s*(?P<reads>\d+).*Brand:\s*" (?P<brand>\w+)".*Condition:\s*" (?P<condition>\w+)"
reads:\s*(?P<reads>\d+) - 给我找一个以reads: 开头的字符串。后跟零个或多个空格 \s* 并创建一个名为 reads 的匹配组,其中包含 \d+ 表示一个或多个数字。
.*Brand:\s*" (?P<brand>\w+)" - 以上后跟零个或多个字符(任何字符)、字符串Brand: 和再次\s* 零个或多个空格后跟双引号和单个空格"。在此之后创建另一个名为 brand 的组,其中包含 \w+ 表示一个或多个字母数字字母。
.*Condition:\s*" (?P<condition>\w+)" - 这和上面第二部分一样,为条件
创建一个匹配组
正则表达式使用标志DOTALL 执行,这意味着. 字符匹配所有字符(包括换行符),因为我们的匹配跨越多行。
运行上述正则表达式后,我们提取 3 个匹配组并将读取匹配从字符串转换为 int。
我将此示例上传到 here,其中包含详细信息及其交互性,因此您可以自己尝试。