2014-12-20 7 views
7

kullanarak HTML Ayrıştırma. İşteNeyi yanlış yapıyorum? Ben LXML kullanarak bir web sayfası ayrıştırmak çalışıyorum ve ben bir div içindeki tüm metin öğeleri geri getirmeye çalışıyor sorun yaşıyorum LXML

Şu an itibariyle
import requests 
from lxml import html 
page = requests.get("https://www.goodeggs.com/sfbay/missionheirloom/seasonal-chicken-stew-16oz/53c68de974e06f020000073f",verify=False) 
tree = html.fromstring(page.text) 
foo = tree.xpath('//section[@class="product-description"]/div[@class="description-body"]/text()') 

"foo" boş bir liste [] geri getiriyor ... Ben bugüne kadar ne var. Diğer sayfalar, bazı içeriği geri getirir, ancak 'un içinde bulunan etiketlerin tümünü içermez. Diğer sayfalar, tüm içeriği geri getirir, çünkü div'un en üst düzeyindedir.

Bunu nasıl div içindeki metin içeriğinin her geri getirebilirim? Teşekkürler!

cevap

3

text iki <p> etiketlerinin içinde, yani metnin bir parçası her p.text içinde yerine div.text içindedir. Ancak, text_content yöntemini çağırarak yerine XPath text() kullanarak <div> tüm çocuklarda tüm metin indirebiliriz:

import requests 
import lxml.html as LH 
url = ("https://www.goodeggs.com/sfbay/missionheirloom/" 
     "seasonal-chicken-stew-16oz/53c68de974e06f020000073f") 
page = requests.get(url, verify=False) 
root = LH.fromstring(page.text) 

path = '//section[@class="product-description"]/div[@class="description-body"]' 
for div in root.xpath(path): 
    print(div.text_content()) 

We’re super excited about the changing seasons! Because the new season brings wonderful new ingredients, we’ll be changing the flavor profile of our stews. Starting with deliveries on Thursday October 9th, the Chicken and Wild Rice stew will be replaced with a Classic Chicken Stew. We’re sure you’ll love it!Mission: Heirloom is a food company based in Berkeley. All of our food is sourced as locally as possible and 100% organic or biodynamic. We never cook with refined oils, and our food is always gluten-free, grain-free, soy-free, peanut-free, legume-free, and added sugar-free. 

PS verir. dfsq, XPath ...//text()'u kullanmayı önerdi. Bu da çalışır, ancak text_content aksine, metin parçaları ayrı öğeler olarak döndürülür:

In [256]: root = LH.fromstring('<a>FOO <b>BAR <c>QUX</c> </b> BAZ</a>') 

In [257]: root.xpath('//a//text()') 
Out[257]: ['FOO ', 'BAR ', 'QUX', ' ', ' BAZ'] 

In [258]: [a.text_content() for a in root.xpath('//a')] 
Out[258]: ['FOO BAR QUX BAZ'] 
+0

Evet, bu tam olarak neye ihtiyacım olduğunu! Teşekkürler. // text() yöntemi çalışır, ancak listedeki öğeleri almak benim kullanım durumum için çalışmaz. – jrubins

2

Ben XPath ifadesi olması gerektiğini düşünüyorum:

//section[@class="product-description"]/div[@class="description-body"]//text() 

UPD'yi. Yukarıdaki ifadede, @unutbu ifadesinin işaret ettiği gibi, metin düğümlerini bir liste olarak alırsınız, bu nedenle bunların üstesinden gelmeniz gerekir. Metin içeriğinin tamamını tek bir metin öğesi olarak kullanmanız gerekirse, diğer seçeneklere ilişkin olarak unutbu'nun yanıtını kontrol edin.

İlgili konular