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

Posted

技术标签:

【中文标题】scrapy:将 html 字符串转换为 HtmlResponse 对象【英文标题】:scrapy: convert html string to HtmlResponse object 【发布时间】:2015-02-04 02:04:42 【问题描述】:

我有一个原始 html 字符串,我想将其转换为 scrapy HTML 响应对象,以便可以使用选择器 cssxpath,类似于 scrapy 的 response。我该怎么做?

【问题讨论】:

【参考方案1】:

首先,如果是调试或测试目的,可以使用Scrapy shell

$ cat index.html
<div id="test">
    Test text
</div>

$ scrapy shell index.html
>>> response.xpath('//div[@id="test"]/text()').extract()[0].strip()
u'Test text'

会话期间有different objects available in the shell,如responserequest


或者,您可以实例化 HtmlResponse class 并在 body 中提供 HTML 字符串:

>>> 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'

【讨论】:

感谢 alecxe,我使用 Selenium 是因为一些 ajaxiness。我想将 driver.page_source 转换为与 resposne 相同的对象,以便我可以重用一些提取器(使用 css 和 xpath 选择器),而不必求助于 lxml。我认为您的第二个选择是我需要的。 @yayu 那么,您可能不需要创建 HTML 响应,而是创建 Selector,请参阅 ***.com/questions/18836286/… 和 ***.com/questions/17975471/…。可能有帮助。谢谢。 @yayu 并且,作为旁注,在项目中你可能会比scrapy拥有更多的硒 - 在这一点上,想想scrapy是否有任何意义. @yayu 还有scrapyjs 可能值得一试——也许你可以避免使用selenium 从今天开始,HtmlResponse 对象需要另一个参数,编码。你可以这样做:HtmlResponse(url='scrapy.org', body=u'some body', encoding='utf-8')【参考方案2】:

alecxe 的答案是对的,但这是在scrapy 中从text 实例化Selector 的正确方法:

>>> from scrapy.selector import Selector
>>> body = '<html><body><span>good</span></body></html>'
>>> Selector(text=body).xpath('//span/text()').get()

'good'

【讨论】:

【参考方案3】:

您可以导入原生的scrapy选择器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:将 html 字符串转换为 HtmlResponse 对象的主要内容,如果未能解决你的问题,请参考以下文章

html 将Eval或数据从字符串转换为int或int转换为string.html

将 HTML 字符串转换为图像

将html转换为JS文件中的html字符串

将 HTML 表格(作为字符串)转换为 JS 对象数组

如何将字符串转换为 html 颜色代码哈希?

PHP怎么将HTML实体转换为普通字符