我需要执行以下操作:
- 取html文件
- 找到每次出现的“img”标签
- 获取他们的 'src' 属性
- 将创建的 url 传递给处理
- 将“src”属性更改为新属性
- 使用 Python 2.7 完成所有这些工作
PS 我听说过 lmxl 和 BeautifulSoup。你建议如何解决这个问题?也许使用正则表达式会更好?还是别的什么?
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 的链接”
使用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))
使用正则表达式解析 HTML通常是个坏主意。使用像 BeautifulSoup 或 lxml.html 这样的 HTML 解析器是一个更好的主意。
使用 BeautifulSoup 的一个吸引力在于它有一个熟悉的 Python 界面。导航有很多功能:find_all
, find_next
, find_previous
, find_parent
,find_next_siblings
等。
支持 BeautifulSoup 的另一点是,有时 BeautifulSoup 可以解析损坏的 HTML(例如,通过插入缺少的结束标签)而lxml
不能。lxml
更严格,如果 HTML 格式错误,只会引发异常。
与 BeautifulSoup API 提供的众多功能相比,lxml
主要使用 XPath 迷你语言进行导航。使用 XPath 的导航往往比使用 BeautifulSoup 的导航更简洁。问题是您必须学习 XPath。lxml 也比 BeautifulSoup 快得多。
因此,如果您刚刚开始,BeautifulSoup 可能更容易立即使用,但最终我相信 lxml 使用起来更愉快。
如果您想使用正则表达式,只需将这个答案扔在那里:
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)
这是一种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
对于您的特定问题,使用or没有确切的优势lxml
。这仅在您的问题的上下文中很重要。