2014-11-21 88 views
1

我使用lxml從html頁面檢索標籤的屬性。 HTML頁面的格式如下:使用lxml從html中提取屬性

<div class="my_div"> 
    <a href="/foobar"> 
     <img src="my_img.png"> 
    </a> 
</div> 

我用檢索<a>標籤內的網址和同一<div><img>標籤的src值時,Python腳本是這樣的:

from lxml import html 

... 
tree = html.fromstring(page.text) 
for element in tree.xpath('//div[contains(@class, "my_div")]//a'): 
    href = element.xpath('/@href') 
    src = element.xpath('//img/@src') 

爲什麼我不能得到字符串?

回答

0

如果你改變你的代碼:

from lxml import html 

... 
tree = html.fromstring(page.text) 
for element in tree.xpath('//div[contains(@class, "my_div")]//a'): 
    href = element.items()[0][1] #gives you the value corresponding to the key "href" 
    src = element.xpath('//img/@src')[0] 
    print(href, src) 

你會得到你所需要的。

documentation of lxml提到了其中的一些內容,但我覺得它缺少一些東西,您可能要考慮使用交互式python shell來研究由tree.xpath()返回的實例的屬性。或者你可以完全查看另一個解析器,如BeautifulSoup,它有很好的例子和文檔。只是分享...

+0

我同意不同意和** ** LXML可能不是最適合的XPath處理,但高於一切,這是一個非常容易使用,快速和強大的HTML/xml解析器。 ** BeautifulSoup **本身沒有解析器,它使用Python標準庫(它比** lxml **相對要慢),但可以配置爲使用第三方,如** lxml **,甚至他們的doc建議安裝** lxml **以提高速度。但我確實同意** BeautifulSoup **有很好的文檔記錄和易於學習。 – Anzel 2014-11-22 04:00:49

+0

@Anzel,我同意你說的一切。的確,BeautifulSoup提到lxml是一個快速庫,不應該被忽視。只是文檔通常是示例的最佳來源,對於社區採用圖書館起着重要作用。注意事項:BeautifulSoup標記問題的數量與標記爲lxml(〜2/1)的問題的數量。 – 2014-11-22 09:01:35

0

你沒有得到你想要的結果的原因是你試圖從下一個孩子而不是現有的節點獲取屬性。

看到這個:

from lxml import html 

s = '''<div class="my_div"> 
    <a href="/foobar"> 
     <img src="my_img.png"> 
    </a> 
</div>''' 

tree = html.fromstring(s) 

# when you do path... //a, you are ALREADY at 'a' node 
for el in tree.xpath('//div[contains(@class, "my_div")]//a'): 
    # you were trying to get next children /@href, which doesn't exist 
    print el.xpath('@href') # you should instead access the existing node's 
    print el.xpath('img/@src') # same here, not /img/@src ... 

['/foobar'] 
['my_img.png'] 

希望這有助於。

2

您正在使用lxml,因此您正在使用lxml對象 - HtmlElement實例進行操作。 的HtmlElement從etree.Element嵌套:http://lxml.de/api/lxml.etree._Element-class.html, 它有得到方法,返回attrubute值。 所以對於你的正確方法是:

from lxml import html 

... 
tree = html.fromstring(page.text) 
for link_element in tree.xpath('//div[contains(@class, "my_div")]//a'): 
    href = link_element.get('href') 
    image_element = href.find('img') 
    if image_element: 
     img_src = image_element.get('src')