【问题标题】:scrapy xpath solution for xml with type=html and html entities带有type = html和html实体的xml的scrapy xpath解决方案
【发布时间】:2013-10-07 12:27:48
【问题描述】:

我正在抓取一个 atom 提要 (xml)。其中一个标签说:

<content type="html">
&lt;p&gt Some text and stuff &lt;/p&gt
</content>

我还看到 img 和 a 标签的相同 html 实体。 是否有一个通用的 xpath 可以像这样找到 img 标签或 p 标签:

//content/p  or //content/img/@src

但显然这不适用于这些 html 实体。或者也许是其他的scrapy解决方案?

【问题讨论】:

    标签: xpath scrapy lxml


    【解决方案1】:

    我认为您需要提取 content 文本元素,并为每个文本元素使用 lxml.html 解析 HTML 内容

    import lxml.etree
    import lxml.html
    
    xmlfeed = lxml.etree.fromstring(xmlfeedstring)
    for content in xmlfeed.xpath('//content[@type="html"]/text()'):
    
        htmlcontent = lxml.html.fragment_fromstring(content)
        paragraphs = htmlcontent.xpath('//p')
        image_urls = htmlcontent.xpath('//img/@src')
    

    请参阅 lxml 文档中的 Parsing HTML fragments

    【讨论】:

    • 这看起来很有希望。我收到 htmlcontent 行的错误:exceptions.TypeError: expected string or buffer。是因为 htmlcontent 以 \n\n\n 开头,还是 htmlcontent 都是 unicode?​​span>
    • 您是直接使用xmlfeed.xpath('//content[@type="html"]/text()') 的结果还是在每个文本元素上循环?您能否分享您的整个代码和示例 XML 提要?
    • 想通了。 标签中有更多的 html 标签(a、p 和 img 的混合)。然后 fragment_fromstring 不起作用,因为它只需要一个标签。尝试了fragments_fromstring,但是你得到了一个列表:(
    • 顺便说一句,我使用方法“fromstring”而不是“fragment_fromstring”,因为它更容易处理。感谢伟大的小费保罗!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多