2011-09-16 103 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'部分的参考。代码几乎相同。这是我的观点。 –