Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python scrapy规范化Xpath中的空间_Python_Xpath_Scrapy - Fatal编程技术网

使用Python 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',

我正在尝试使用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', 
 '\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')可以更精确地确定要选择的节点。
这会根据空间分割项目,这会给我错误的结果。。操作学习程序应该是一个值,而不是三个值我刚才添加的:)