【发布时间】:2010-01-19 23:07:57
【问题描述】:
我正在使用 Python,需要查找和检索标签之间的所有字符数据:
<tag>I need this stuff</tag>
然后我想将找到的数据输出到另一个文件。我只是在寻找一种非常简单有效的方法来做到这一点。
如果您可以发布一个快速代码 sn-p 来描绘易用性。因为我在理解解析器时遇到了一些麻烦。
【问题讨论】:
我正在使用 Python,需要查找和检索标签之间的所有字符数据:
<tag>I need this stuff</tag>
然后我想将找到的数据输出到另一个文件。我只是在寻找一种非常简单有效的方法来做到这一点。
如果您可以发布一个快速代码 sn-p 来描绘易用性。因为我在理解解析器时遇到了一些麻烦。
【问题讨论】:
没有外部模块,例如
>>> 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
【讨论】:
这就是我的做法:
(myhtml.split('<tag>')[1]).split('</tag>')[0]
告诉我它是否有效!
【讨论】:
我非常喜欢解析成element tree,然后使用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")
【讨论】:
Beautiful Soup 是一个很棒的 Python 的 HTML/XML 解析器:
Beautiful Soup 是 Python HTML/XML 专为快速周转而设计的解析器 像屏幕抓取这样的项目。三 功能使其功能强大:
- Beautiful Soup 不会因为你的错误标记而窒息。它产生一个 解析树大约为 与您的原始文件一样有意义。 这通常足以收集 你需要的数据然后逃跑。
- Beautiful Soup 提供了一些简单的方法和 Pythonic 成语 导航、搜索和修改 解析树:用于剖析 记录并提取您需要的内容。 您不必创建自定义 每个应用程序的解析器。
- Beautiful Soup 自动将传入的文档转换为 Unicode 并将传出文档转换为 UTF-8。你 不必考虑编码, 除非文件没有指定 编码和美丽的汤不能 自动检测一个。然后你只需要 指定原始编码。
【讨论】:
使用xpath和lxml;
from lxml import etree
pageInMemory = open("pageToParse.html", "r")
parsedPage = etree.HTML(pageInMemory)
yourListOfText = parsedPage.xpath("//tag//text()")
saveFile = open("savedFile", "w")
saveFile.writelines(yourListOfText)
pageInMemory.close()
saveFile.close()
比美丽的汤更快。
如果你想测试你的 Xpath - 我找到 FireFox's Xpather extremely helpful。
补充说明:
【讨论】:
Abstract-作为
def value_tag(s):
i = s.index('>')
s = s[i+1:]
i = s.index('<')
s = s[:i]
return s
【讨论】: