2013-02-15 160 views
19

我試圖在Python中使用lxml和xpath獲取子節點的HTML內容。如下面的代碼所示,我想查找每個產品節點的html內容。它有沒有像product.html這樣的方法?獲取lxml中元素的內部HTML

productGrids = tree.xpath("//div[@class='name']/parent::*") 
for product in productGrids: 
    print #html content of product 

回答

26
from lxml import etree 
print(etree.tostring(root, pretty_print=True)) 

你可以在這裏看到更多的例子:http://lxml.de/tutorial.html

+1

感謝。這正是我正在尋找的。 – 2013-02-15 14:08:26

+2

記住它有一個可選參數'encode',像這樣使用:'etree.tostring(xxxxx,encoding ='unicode')' – shellbye 2016-11-17 09:32:37

+2

這是* outer * HTML。 – 2017-07-21 09:15:25

8

我相信你想使用的tostring()方法:

from lxml import etree 

tree = etree.fromstring('<html><head><title>foo</title></head><body><div class="name"><p>foo</p></div><div class="name"><ul><li>bar</li></ul></div></body></html>') 
for elem in tree.xpath("//div[@class='name']"): 
    # pretty_print ensures that it is nicely formatted. 
    print etree.tostring(elem, pretty_print=True) 
-1

另一種方式來做到這一點

x=doc.xpath("//div[@class='name']/parent::*") 
print(map(etree.tostring,x)) 
-2

正確後點擊(複製,複製XPath)你想要的特定字段(在Chrome的檢查),你可能會得到這樣的事情:

//*[@id="specialID"]/div[12]/div[2]/h4/text()[1] 

如果你想要一個文本元素的每一個「特殊身份」

//*[@id="specialID"]/div/div[2]/h4/text()[1] 

你可以選擇其他領域,它會交織的結果

//*[@id="specialID"]/div/div[2]/h4/text()[1] | //*[@id="specialID"]/div/some/weird/path[95] 

例可以改進,但它說明了一點:

//*[@id="mw-content-text"]/div/ul[1]/li[11]/text() 

from lxml import html 
import requests 
page = requests.get('https://en.wikipedia.org/wiki/Web_scraping') 
tree = html.fromstring(page.content) 
data = tree.xpath('//*[@id="mw-content-text"]/div/ul[1]/li/a/text() | //*[@id="mw-content-text"]/div/ul[1]/li/text()[1]') 
print(len(data)) 
for i in range(len(data)): 
    print(data[i])