我正在使用scrapy,我正在尝试寻找包含特定文本的跨度。我有:
response.selector.xpath('//*[@class="ParamText"]/span/node()')
返回:
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u' MILES STODOLINK'>,
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u'C'>,
<Selector xpath='//*[@class="ParamText"]/span/text()' data=u' MILES STODOLINK'>]
但是当我跑步时:
>>> response.selector.xpath('//*[@class="ParamText"]/span[contains(text(),"STODOLINK")]')
Out[11]: []
为什么包含功能不起作用?
答案 0 :(得分:11)
contains()
无法一次评估多个节点:
/span[contains(text(),"STODOLINK")]
因此,如果span
中有多个文本节点,而"STODOLINK"
中的span
不在{em> contains()
的第一个文本节点子节点中,然后上面表达式中的contains()
将无效。您应该尝试对单个文本节点应用//*[@class="ParamText"]/span[text()[contains(.,"STODOLINK")]]
检查,如下所示:
"STODOLINK"
或者如果span
不一定直接位于span
内(可以嵌套在.
中的其他元素中),那么您只需使用text()
代替//*[@class="ParamText"]/span[contains(.,"STODOLINK")]
:
select max(id),Staff_name from position group by Staff_name
答案 1 :(得分:2)
在我的终端中(假设我的示例与您的文件相同),您的代码可以正常工作:
<强>输入强>
import scrapy
example='<div class="ParamText"><span>STODOLINK</span></div>'
scrapy.Selector(text=example).xpath('//*[@class="ParamText"]/span[contains(text(),"STODOLINK")]').extract()
<强>输出:强>
['<span>STODOLINK</span>']
你能澄清一下可能有什么不同吗?
答案 2 :(得分:1)
我使用Scrapy with BeautifulSoup4.0。 IMO,Soup易于阅读和理解。如果您不必使用HtmlXPathSelector,则可以选择此选项。以下是查找所有链接的示例。您可以用'span'替换它。希望这有帮助!
import scrapy
from bs4 import BeautifulSoup
import Item
def parse(self, response):
soup = BeautifulSoup(response.body,'html.parser')
print 'Current url: %s' % response.url
item = Item()
for link in soup.find_all('a'):
if link.get('href') is not None:
url = response.urljoin(link.get('href'))
item['url'] = url
yield scrapy.Request(url,callback=self.parse)
yield item