在Python中轻松获取XML或HTML文件标签之间的数据的方法?
我正在使用Python,想要找到并提取标签之间的所有字符数据:
<tag>I need this stuff</tag>
然后我想把找到的数据输出到另一个文件里。我只是想找一个非常简单高效的方法来做到这一点。
如果你能提供一个简单的代码示例,来展示这个过程有多简单就好了。因为我对解析器有点困惑。
6 个回答
2
Beautiful Soup 是一个非常棒的 Python HTML/XML 解析工具:
Beautiful Soup 是一个专为快速项目设计的 Python HTML/XML 解析器,特别适合像网页抓取这样的工作。它有三个强大的特点:
- Beautiful Soup 不会因为你给它糟糕的标记而崩溃。它会生成一个解析树,这个树大致上能反映你原始文档的结构。通常,这样就足够你提取需要的数据了。
- Beautiful Soup 提供了一些简单的方法和 Python 风格的用法,帮助你浏览、搜索和修改解析树。就像一个工具箱,让你可以轻松拆解文档,提取你需要的内容。你不需要为每个应用程序都创建一个自定义的解析器。
- Beautiful Soup 会自动把输入的文档转换成 Unicode 格式,把输出的文档转换成 UTF-8 格式。你不需要担心编码问题,除非文档没有指定编码,而 Beautiful Soup 也无法自动识别。这种情况下,你只需要告诉它原始的编码格式。
2
我挺喜欢把数据解析成元素树,然后用element.text
和element.tail
来提取信息。
它还支持类似XPath的搜索功能。
>>> from xml.etree.ElementTree import ElementTree
>>> tree = ElementTree()
>>> tree.parse("index.xhtml")
<Element html at b7d3f1ec>
>>> p = tree.find("body/p") # Finds first occurrence of tag p in body
>>> p
<Element p at 8416e0c>
>>> p.text
"Some text in the Paragraph"
>>> links = p.getiterator("a") # Returns list of all links
>>> links
[<Element a at b7d4f9ec>, <Element a at b7d4fb0c>]
>>> for i in links: # Iterates through all found links
... i.attrib["target"] = "blank"
>>> tree.write("output.xhtml")
8
不使用外部模块,比如
>>> myhtml = """ <tag>I need this stuff</tag>
... blah blah
... <tag>I need this stuff too
... </tag>
... blah blah """
>>> for item in myhtml.split("</tag>"):
... if "<tag>" in item:
... print item [ item.find("<tag>")+len("<tag>") : ]
...
I need this stuff
I need this stuff too