6

我需要执行以下操作:

  1. 取html文件
  2. 找到每次出现的“img”标签
  3. 获取他们的 'src' 属性
  4. 将创建的 url 传递给处理
  5. 将“src”属性更改为新属性
  6. 使用 Python 2.7 完成所有这些工作

PS 我听说过 lmxl 和 BeautifulSoup。你建议如何解决这个问题?也许使用正则表达式会更好?还是别的什么?

4

4 回答 4

7
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 的链接”

于 2013-10-14T09:52:46.817 回答
6

使用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 的导航更简洁。问题是您必须学习 XPathlxml 也比 BeautifulSoup 快得多。

因此,如果您刚刚开始,BeautifulSoup 可能更容易立即使用,但最终我相信 lxml 使用起来更愉快。

于 2013-10-14T10:10:09.977 回答
2

如果您想使用正则表达式,只需将这个答案扔在那里:

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)
于 2013-10-14T10:04:05.570 回答
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对于您的特定问题,使用or没有确切的优势lxml。这仅在您的问题的上下文中很重要。

于 2013-10-14T10:01:36.163 回答