我需要做以下事情:
P.S。我听说过lmxl和BeautifulSoup。你怎么建议解决这个问题?也许最好使用正则表达式呢?还是别的什么?
答案 0 :(得分:5)
使用lxml,
import lxml.html as LH
root = LH.fromstring(html_string)
for el in root.iter('img'):
el.attrib['src'] = 'new src'
print(LH.tostring(root, pretty_print=True))
使用正则表达式is generally a bad idea解析HTML。 使用像BeautifulSoup或lxml.html这样的HTML解析器是个更好的主意。
使用BeautifulSoup的一个吸引力在于它具有熟悉的Python界面。导航功能有很多:find_all
,find_next
,find_previous
,find_parent
,find_next_siblings
等。
支持BeautifulSoup的另一个观点是,当lxml
不能时,BeautifulSoup有时可以解析破坏的HTML(例如,通过插入缺少的结束标记)。 lxml
更严格,如果HTML格式不正确,则会引发异常。
与BeautifulSoup API提供的众多功能相比,lxml
主要使用XPath迷你语言进行导航。使用XPath进行导航往往比使用BeautifulSoup的等效导航更简洁。问题是你必须learn XPath。 lxml is also much much faster than BeautifulSoup.
因此,如果您刚刚开始,BeautifulSoup可能更容易立即使用,但最后我相信lxml更适合使用。
答案 1 :(得分:4)
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_string)
for link in soup.findAll('a')
link['src'] = 'New src'
html_string = str(soup)
我不是特别喜欢BeautifulSoup,但它可以帮到你。如果你不需要,尽量不要过度使用你的解决方案,这是解决一般问题所能做的最简单的事情之一。
这种悲伤,为未来而建立同样重要,但所有6个要求都可以归为一个,“我想改变'src'或所有链接到X”
答案 2 :(得分:1)
以下是lxml
方法:
import lxml.html
filename = 'your_html_filename.html'
document = lxml.html.parse(filename)
tag = 'your_tag_name'
elements = document.xpath('//{}'.format(tag))
for e in elements:
e.attrib['src'] = 'new value'
result = str(document)
对于您的特定问题,使用BS
或lxml
没有确切的优势。这只会在你的问题背景下发挥作用。
答案 3 :(得分:1)
如果您想使用正则表达式,只需将此答案放在那里:
html = """
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js"></script>
</body>
</html>
"""
import re
find = re.compile(r'src="[^"]*"')
print find.sub('src="changed"', html)