使用Python和lxml获取并更改元素文本

2 投票
1 回答
4431 浏览
提问于 2025-04-17 02:27

首先,我知道在StackOverflow上已经有很多关于Python和lxml的问题,我也读过大部分,甚至可能是全部。现在我想要一个更全面的答案。

我正在进行一些HTML转换,需要对HTML进行语法解析,然后对一些内容进行修改,比如hrefimg等。

这是我目前的一个简化版本:

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解析时!

1 个回答

1

lxmlElementTree 其实挺像的。lxml 的文档中关于 ElementTree 的部分,基本上就是指向 ElementTree 的文档。

你可以试着看看这个 ElementTree 的教程和示例,它在概述页面的底部。因为 ElementTree 是 Python 自带的,所以相关的资料很多,网上也容易找到。一旦你掌握了这些内容,如果需要的话,可以再学习一些 lxml 的高级用法,这些在 ElementTree 中是没有的。例如,lxml 会为每个元素维护父子关系,而 ElementTree 则没有。虽然你可以给 ElementTree 添加父子关系,但这并不是一个简单的入门例子。

这就是我学习的方式。

撰写回答