Scrapy - 使用正则表达式选择 xpath

way*_*way 3 python xpath scrapy web-scraping python-2.7

我正在抓取的部分 html 如下所示:

<h2> <span class="headline" id="Profile">Profile</span></h2>
<ul><li> <b>Name</b> Albert Einstein
</li><li> <b>Birth Name:</b> Alberto Ein
</li><li> <b>Birthdate:</b> December 24, 1986
</li><li> <b>Birthplace:</b> <a href="/Ulm" title="Dest">Ulm</a>, Germany
</li><li> <b>Height:</b> 178cm
</li><li> <b>Blood Type:</b> A
</li></ul>
Run Code Online (Sandbox Code Playgroud)

我想提取每个组件 - 所以姓名,出生姓名,生日等。

要提取我所做的名称:

a_name = response.xpath('//ul/li/b[contains(text(),"Name")]/../descendant::text()').extract()
Run Code Online (Sandbox Code Playgroud)

然后我检查 a_name 不是空列表,然后调用:

"".join(a_name[2:]).strip()
Run Code Online (Sandbox Code Playgroud)

我这样做是为了保持一致性,因为在出​​生地,我只想提取文本,不包括所有 html 属性。所以我会选择德国乌尔姆。

问题是,当我使用 contains(text(), "Name") 时,出生姓名的条目也匹配。构建选择器时如何避免这种情况?

使用正则表达式,我可以指定类似 text() 匹配 ^Name.* 的内容,因为文本 Name 后跟冒号和/或空格可能会也可能不会。

有没有办法使用正则表达式来解决这个问题?

Hen*_*ura 8

如果你想使用正则表达式,你可以试试这个:

response.xpath('//ul/li/b[text()[re:test(., '^Name.*')]]/../descendant::text()') 
Run Code Online (Sandbox Code Playgroud)

但是你最好使用starts-with

response.xpath('//ul/li/b[starts-with(text(),"Name")]/../descendant::text()')
Run Code Online (Sandbox Code Playgroud)