Python scrapy:将html字符串转换为HtmlResponse对象
我有一个原始html字符串,我想将其转换为scrapy html响应对象,这样我就可以使用选择器Python scrapy:将html字符串转换为HtmlResponse对象,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我有一个原始html字符串,我想将其转换为scrapy html响应对象,这样我就可以使用选择器css和xpath,类似于scrapy的response。如何操作?首先,如果是出于调试或测试目的,您可以使用: 的答案是正确的,但这是从文本中实例化选择器的正确方法: >>从scrapy.selector导入选择器 >>>body=‘good’ >>>选择器(text=body).xpath('//span/text()').get() “很好” 您可以导入本机scrapy selectorsele
css
和xpath
,类似于scrapy的response
。如何操作?首先,如果是出于调试或测试目的,您可以使用:
的答案是正确的,但这是从文本中实例化选择器的正确方法:
>>从scrapy.selector导入选择器
>>>body=‘good’
>>>选择器(text=body).xpath('//span/text()').get()
“很好”
您可以导入本机scrapy selectorselector
并将html字符串声明为要分析的文本arg
from scrapy.selector import Selector
def get_list_text_from_html_string(html_string):
html_item = Selector(text=html_string)
elements = [_li.get() for _li in html_item.css('ul > li::text')]
return elements
list_html_string = '<ul class="teams">\n<li>Bayern M.</li>\n<li>Palmeiras</li>\n<li>Liverpool</li>\n<li>Flamengo</li></ul>'
print(get_list_text_from_html_string(list_html_string))
>>> ['Bayern M.', 'Tigres', 'Liverpool', 'Flamengo']
从scrapy.selector导入选择器
def get_list_text_from_html_字符串(html_字符串):
html\u项=选择器(文本=html\u字符串)
elements=[\u li.get()表示html\u item.css中的[u li('ul>li::text')]
返回元素
罗列\n拜仁M. \n帕尔梅拉斯 \n利物浦 \n弗拉门戈'
打印(从html字符串(列表html字符串)获取列表文本)
>>>[‘拜仁M.’、‘泰格里斯’、‘利物浦’、‘弗拉门戈’]
谢谢alecxe,我使用硒是因为它有点不健康。我想将driver.page_source转换为与resposne相同的对象,这样我就可以重用一些提取器(使用css和xpath选择器),而不必求助于lxml。我认为您的第二个选项是我需要的。@yayu那么,您可能不需要创建HTML响应,而是创建一个选择器,请参见和。也许会有帮助。谢谢。@yayu,顺便说一句,在这个项目中,你可能会比scrapy拥有更多的硒元素-在这一点上,考虑一下scrapy是否有任何意义。@yayu也可能值得一试-可能你可以避免使用selenium
。从今天开始,HtmlResponse对象需要另一个参数,编码。您可以这样做:HtmlResponse(url='',body=u'some body',encoding='utf-8')
>>> from scrapy.http import HtmlResponse
>>> response = HtmlResponse(url="my HTML string", body='<div id="test">Test text</div>', encoding='utf-8')
>>> response.xpath('//div[@id="test"]/text()').extract()[0].strip()
u'Test text'
>>> from scrapy.selector import Selector
>>> body = '<html><body><span>good</span></body></html>'
>>> Selector(text=body).xpath('//span/text()').get()
'good'
from scrapy.selector import Selector
def get_list_text_from_html_string(html_string):
html_item = Selector(text=html_string)
elements = [_li.get() for _li in html_item.css('ul > li::text')]
return elements
list_html_string = '<ul class="teams">\n<li>Bayern M.</li>\n<li>Palmeiras</li>\n<li>Liverpool</li>\n<li>Flamengo</li></ul>'
print(get_list_text_from_html_string(list_html_string))
>>> ['Bayern M.', 'Tigres', 'Liverpool', 'Flamengo']