2011-09-16 136 views
2

首先,我知道有很多關於StackOverflow上的python和lxml的問題,並且我確實已經閱讀了大部分,如果不是全部的話。現在我在這個問題上尋找更全面的答案。使用python和lxml獲取元素和更改元素文本

我正在做一些HTML轉換,我需要語法分析HTML,然後做一些內容更改爲href,img等。

這是我現在所擁有的一個簡化版本:

with open(fileName, "r") as inFile: 
    inputS = inFile.read() 

myTree = fromstring(inputS) #parse etree from HTML content 

breadCrumb = myTree.get_element_by_id("breadcrumb") #a list of elements with matching id 
breadCrumbContent = breadCrumb[0].text_content().strip() #text content of bread crumb 

h1 = myTree.xpath('//h1') #another way, get elements by xpath 
h1Content = h1[0].text_content().strip() #get text content 

getTail = myTree.cssselect('table.results > tr > td > a + span + br') #get list of elements using css select 

所以基本上這就是我知道此刻。有沒有其他方法可以使用lxml獲取元素/屬性?我知道他們可能不是最好的辦法,但是忍耐着我,我對這件事情很陌生。

以下是我想要做的。我有:

<img src="images/macmail10.gif" alt="" width="555" height="485" /><br /> 
<a href="http://www.some_url.com/faq/general_faq.html" target="_blank">General FAQs page</a> 

它們可以嵌套像divp任何其他元素裏面。我想要做的是以編程方式尋找那些元素;對於圖像,我想提取src,做一些操作,並將src設置爲別的東西(例如,src="images/something.jpg"轉換爲src="something_images.jpg"),href也是這樣,我想改變它使其指向其他地方。

除此之外,我也想刪除從樹的一些元素,以簡化它,例如:

<head> 
    <title>something goes here</title> 
</head> 
<div> 
    <p id="some_p"> Some content </p> 
</div> 

我想刪除的頭節點和DIV,我將能夠獲得與id="some_p" p,有沒有什麼辦法來抓父元素?還有什麼方法可以刪除這些元素? (在這種情況下,尋找head,刪除head然後找id="some_p",得到了parent並將其刪除。

謝謝!

================ ==================================

更新:我已經找到了解決方案,並已完成使用lxml.etree進行編碼,只要stackoverflow允許我發佈答案,我真的希望這個問題的答案能幫助別人處理HTML解析!

+0

+1對於一個明確的問題。 (而不是嘗試使用正則表達式!) –

回答

1

lxmlElementTreequite similar。實際上,lxml文檔站點的ElementTree部分只是指向ElementTree的文檔。

您可以嘗試通過總覽頁面底部的ElementTree tutorials and examples。由於ElementTree是Python發行版的一部分,因此它被廣泛記錄(並且很容易被谷歌搜索到)。一旦你瞭解了這些,如果你需要的話,可以擴展一些在ElementTree中沒有找到的lmlx魔法。例如,lxml維護每個元素的父關係,而ElementTree則不會。您可以將父母關係添加到ElementTree,但這不是一個簡單的例子。

那我是怎麼學的呢。

+0

如果可能的話,我更喜歡使用lxml中的etree :(... –

+0

@Tanner Hoang:你*可以*使用'etree'。我建議你在他們的網站上使用來自ElementTree的**教程和例子**,因爲它完全記錄在案。您可以從'lxml'在'etree'中編碼和測試,但是使用ElementTree材質作爲'lxml'的'etree'部分的參考。代碼幾乎相同。這是我的觀點。 –