使用Python scrapy规范化Xpath中的空间
我正在尝试使用Scrapy和Xpath从网站中提取内容。下面这句话让我得到了我想要的:使用Python scrapy规范化Xpath中的空间,python,xpath,scrapy,Python,Xpath,Scrapy,我正在尝试使用Scrapy和Xpath从网站中提取内容。下面这句话让我得到了我想要的: response.xpath('//h2[@class="schoolName"]/following-sibling::ul//text()').getall() 但是,列表的输出如下所示: [' \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t', '\n\t\t\t\t\t\tAccounting (ACCT)\n\t\t\t\t\t',
response.xpath('//h2[@class="schoolName"]/following-sibling::ul//text()').getall()
但是,列表的输出如下所示:
[' \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t',
'\n\t\t\t\t\t\tAccounting (ACCT)\n\t\t\t\t\t',
'\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t',
'\n\t\t\t\t\t\tAction Learning Programs (ALP)\n\t\t\t\t\t',
'\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t',
'\n\t\t\t\t\t\tEconomic Analysis & Policy (MGTECON)\n\t\t\t\t\t',
'\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t', '\n\t\t\t\t\t\tFinance
(FINANCE)\n\t\t\t\t\t', '\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t',
'\n\t\t\t\t\t\tGSB General & Interdisciplinary (GSBGEN)\n\t\t\t\t\t',
'\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t', '\n\t\t\t\t\t\tHuman Resource Management
(HRMGT)\n\t\t\t\t\t', '\n\t\t\t']
很明显,输出中充满了带有\n和\t的额外空格。我不想再次遍历该列表以删除这些不需要的字符,因为该列表很大(为了可读性而被截断)。为了解决这个问题,我尝试使用Xpath的规范化空间,但没有成功
>>>response.xpath('normalize-space(//h2[@class="schoolName"]/following-sibling::ul//text())').getall()
['']
我做错了什么?您可以使用split()
作为规范化-space()的替代方法。
:
我的输出:
['Accounting', '(ACCT)']
[]
['Action', 'Learning', 'Programs', '(ALP)']
[]
['Economic', 'Analysis', '&', 'Policy', '(MGTECON)']
[]
['Finance', 'FINANCE)']
[]
['GSB', 'General', '&', 'Interdisciplinary', '(GSBGEN)']
[]
['Human', 'Resource', 'Management', '(HRMGT)']
[]
然后你可以简单地将包含内容的输出值存储在一个额外的列表中,如下所示:
最终代码:
...
list = response.xpath('//h2[@class="schoolName"]/following-sibling::ul//text()').getall()
output = []
for x in list:
i = x.split()
if i:
output.append(" ".join(i))
print(output)
输出:
['Accounting (ACCT)', 'Action Learning Programs (ALP)', 'Economic Analysis & Policy (MGTECON)', 'Finance FINANCE)', 'GSB General & Interdisciplinary (GSBGEN)', 'Human Resource Management (HRMGT)']
['Accounting (ACCT)', 'Action Learning Programs (ALP)', 'Economic Analysis & Policy (MGTECON)', 'Finance FINANCE)', 'GSB General & Interdisciplinary (GSBGEN)', 'Human Resource Management (HRMGT)']
单线解决方案:(基于JaSON的想法)
输出:
['Accounting (ACCT)', 'Action Learning Programs (ALP)', 'Economic Analysis & Policy (MGTECON)', 'Finance FINANCE)', 'GSB General & Interdisciplinary (GSBGEN)', 'Human Resource Management (HRMGT)']
['Accounting (ACCT)', 'Action Learning Programs (ALP)', 'Economic Analysis & Policy (MGTECON)', 'Finance FINANCE)', 'GSB General & Interdisciplinary (GSBGEN)', 'Human Resource Management (HRMGT)']
您需要使用
strip
方法去除制表符/新行字符:
[text for text in [text.strip() for text in response.xpath('//h2[@class="schoolName"]/following-sibling::ul//text()').getall()] if text]
将索引稍微深入到目标节点,例如
/ul/li/a/text()
而不是/ul//text()
可以修复空项问题。请注意,我访问了you want scrape并尝试了一些XPath
然后,您所要做的就是应用JaSON提到的剥离逻辑,例如:
map(lambda x:x.strip(),response.xpath('//h2[@class=“schoolName”]/以下同级::ul/li/a/text()))
此外,规范化空间是否在多个节点上工作取决于您的scrapy版本中使用的XPath版本。在这方面,你的帖子是的复制品,你可以尝试在末尾使用
.extract()
。这是否回答了你的问题?此外,我还查看了您试图删除的网站的html。通过添加:li/a
例如response.xpath('//h2[@class=“schoolName”]/following sibling::ul/li/a')可以更精确地确定要选择的节点。
这会根据空间分割项目,这会给我错误的结果。。操作学习程序应该是一个值,而不是三个值我刚才添加的:)