2013-02-15 12 views
19

Próbuję pobrać treść HTML węzła potomnego z lxml i xpath w Pythonie. Jak pokazano w poniższym kodzie, chcę znaleźć zawartość html dla każdego z węzłów produktu. Czy ma jakieś metody, takie jak product.html?Pobierz wewnętrzny kod HTML elementu w lxml

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

Odpowiedz

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

można zobaczyć więcej przykładów tutaj: http://lxml.de/tutorial.html

+1

Dzięki. Tego właśnie szukałem. –

+2

Pamiętaj, że ma opcjonalny parametr 'encode' używaj w następujący sposób:' etree.tostring (xxxxx, encoding = 'unicode') ' – shellbye

+2

To jest * zewnętrzny * HTML. –

8

wierzę chcesz użyć metody 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

inny sposób to zrobić

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

Po prawej kliknięcie (kopia, kopia XPath) w danej dziedzinie, którą chcesz (w Inspektorze Chrome), można uzyskać coś takiego:

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

Jeśli chciał ten element tekstowy dla każdego „specialID”

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

można wybrać kolejne pole i będzie ona przeplatają wyniki

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

Przykład mogłoby być lepsze, ale to ilustruje punkt:

//*[@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]) 
Powiązane problemy