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

Python Scrapy-使用正则表达式选择xpath,python,python-2.7,xpath,web-scraping,scrapy,Python,Python 2.7,Xpath,Web Scraping,Scrapy,我正在抓取的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>

我正在抓取的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>
from scrapy.selector import Selector
source = '''
<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>
'''

a_name = Selector(text=source).xpath('//ul/li//text()').extract()
all_li = ''.join(a_name).strip().split("\n")
print(all_li)
然后我检查一个_名称是否为空列表,并调用:

"".join(a_name[2:]).strip()
我这样做是为了保持一致性,因为在诞生地,我只想提取文本,不包括所有html属性。所以我会去德国的乌尔姆

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

使用正则表达式,我可以指定类似text()matches^Name.*的内容,因为文本名称后面可能跟不上冒号和或空格


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

尝试提取所有元素li的文本,然后解析文本列表,如下所示:

<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>
from scrapy.selector import Selector
source = '''
<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>
'''

a_name = Selector(text=source).xpath('//ul/li//text()').extract()
all_li = ''.join(a_name).strip().split("\n")
print(all_li)

如果要使用正则表达式,可以尝试以下方法:

response.xpath('//ul/li/b[text()[re:test(., '^Name.*')]]/../descendant::text()') 
但你最好从开始就使用

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

感谢您展示这两个选项!我还没有意识到start with function,这正是我所需要的。有没有办法使
re:test
方法不区分大小写?我似乎不知道如何使用re.IGNORECASE