有没有一种方法可以使用CSS在Scrapy中提取文本以及文本链接?

时间:2019-04-21 04:01:12

标签: python scrapy

我是Scrapy的新手。我已经学会了如何使用response.css()从网页中读取特定方面,并且避免学习xpath系统。它似乎做的完全一样,只是格式不同(如果我输入错了,请纠正我)

我要抓取的网站上有很长的一段文字,中间偶尔有一个链接的文字。这个带有link to a picture of a dog的句子就是一个例子。我不确定是否有一种方法可以让蜘蛛读取文本并提供链接(我只使用过response.css("p::text").extract()

有没有一种方法,可以使用CSS(最好是CSS或xpath)来获取段落中的所有文本,包括链接嵌入的文本,而无需将链接或链接文本移出句子?如果需要重新解释或举一个例子,在此道歉很难措辞。

编辑:需要澄清,起初对此解释不多。该网页中的声明如下所示: <p>My sentence has a <a href="https://www.google.com">link to google</a> in it.</p> 但是,当您使用response.css("p::text").extract()时,该句子将显示为列表[“我的句子中带有”,“。”],从而完全否定链接中的文本。我的目标是获得:[“我的句子中有一个指向google的链接。”]

2 个答案:

答案 0 :(得分:0)

您可以尝试使用以下表达式提取文本:

>>> txt = """<p>My sentence has a <a href="https://www.google.com">link to google</a> in it.</p>"""
>>> from scrapy import Selector
>>> sel = Selector(text=txt)
>>> sel.css('p ::text').extract()
[u'My sentence has a ', u'link to google', u' in it.']
>>> ' '.join(sel.css('p ::text').extract())
u'My sentence has a  link to google  in it.'

或者,例如,使用w3lib.html库从响应中清除html标签。通过这种方式:

from w3lib.html import remove_tags
with_tags = response.css("p").get()
clean_text = remove_tags(with_tags)

但是第一个变体看起来更短且更易读。

答案 1 :(得分:0)

在提取整个段落后使用html-text

from html_text import extract_text

for paragraph in response.css('p'):
    html = paragraph.get()
    text = extract_text(html)