2013-10-01 36 views
2

我正在刮一個atom feed(xml)。其中一個標籤說:scrapy xpath xml type = html和html實體的解決方案

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

此外,我看到相同的HTML實體img和標籤。 是否有一個通用的XPath查找img標籤或類似這樣的p標籤:

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

但顯然這不符合這些HTML實體工作。或者也許還有其他解決方案與scrapy?

回答

3

我認爲你需要提取content文本元素,併爲每個,解析使用lxml.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') 

Parsing HTML fragments從LXML文件的HTML內容。

+0

這看起來很有前途。我得到了htmlcontent行的錯誤:* exceptions.TypeError:預期的字符串或緩衝區*。是否因爲html內容以**開頭?\ n \ n \ n **,或者htmlcontent可能都是unicode? – Geveze

+0

你是直接使用'xmlfeed.xpath('// content [@ type =「html」]/text()')'的結果還是循環使用每個文本元素?你可以分享你的整個代碼和XML feed嗎? –

+0

想通了。 標籤中有更多的html標籤(混合使用a,p和img)。然後fragment_fromstring不起作用,因爲它只需要一個標籤。嘗試fragments_fromstring,但是然後你得到一個列表:( – Geveze