Python scrapy:将html字符串转换为HtmlResponse对象

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

我有一个原始html字符串,我想将其转换为scrapy html响应对象,这样我就可以使用选择器
css
xpath
,类似于scrapy的
response
。如何操作?

首先,如果是出于调试或测试目的,您可以使用:

的答案是正确的,但这是从
文本中实例化
选择器的正确方法:

>>从scrapy.selector导入选择器
>>>body=‘good’
>>>选择器(text=body).xpath('//span/text()').get()
“很好”

您可以导入本机scrapy selector
selector
并将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']