Beautifulsoup findall
Posted
技术标签:
【中文标题】Beautifulsoup findall【英文标题】:beautifulsoup findall 【发布时间】:2012-05-18 03:23:55 【问题描述】:我有一些 xml:
<article>
<uselesstag></uslesstag>
<topic>oil, gas</topic>
<body>body text</body>
</article>
<article>
<uselesstag></uslesstag>
<topic>food</topic>
<body>body text</body>
</article>
<article>
<uselesstag></uslesstag>
<topic>cars</topic>
<body>body text</body>
</article>
有很多很多无用的标签。 我想用beautifulsoup 来收集body 标签中的所有文本以及它们相关的主题文本来创建一些新的xml。
我是 python 新手,但我怀疑某种形式的
import arff
from xml.etree import ElementTree
import re
from StringIO import StringIO
import BeautifulSoup
from BeautifulSoup import BeautifulSoup
totstring=""
with open('reut2-000.sgm', 'r') as inF:
for line in inF:
string=re.sub("[^0-9a-zA-Z<>/\s=!-\"\"]+","", line)
totstring+=string
soup = BeautifulSoup(totstring)
body = soup.find("body")
for anchor in soup.findAll('body'):
#Stick body and its topics in an associated array?
file.close
会起作用的。
1) 我该怎么做? 2) 我应该向 XML 添加根节点吗?否则它不是正确的 XML 是吗?
非常感谢
编辑:
我想结束的是:
<article>
<topic>oil, gas</topic>
<body>body text</body>
</article>
<article>
<topic>food</topic>
<body>body text</body>
</article>
<article>
<topic>cars</topic>
<body>body text</body>
</article>
有很多很多无用的标签。
【问题讨论】:
那么,你是想从标签 A、B、C 中获取内容还是获取所有标签内容,忽略标签 D、E、F ? 是的,我想要 2 种类型的标签(正文和主题)并忽略其他内容(日期、时间等) 【参考方案1】:好的。这是解决方案,
首先,确保您安装了“beautifulsoup4”:http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup
这是我获取所有正文和主题标签的代码:
from bs4 import BeautifulSoup
html_doc= """
<article>
<topic>oil, gas</topic>
<body>body text</body>
</article>
<article>
<topic>food</topic>
<body>body text</body>
</article>
<article>
<topic>cars</topic>
<body>body text</body>
</article>
"""
soup = BeautifulSoup(html_doc)
bodies = [a.get_text() for a in soup.find_all('body')]
topics = [a.get_text() for a in soup.find_all('topic')]
【讨论】:
嘿,感谢@Arthur Neves 的帮助,但我得到了 Traceback(最近一次通话最后一次):文件“convert.py”,第 23 行,在另一种删除空 xml 或 html 标签的方法是使用递归函数搜索空标签并使用 .extract() 将其删除。这样,您不必手动列出要保留的标签。它还可以清除嵌套的空标签。
from bs4 import BeautifulSoup
import re
nonwhite=re.compile(r'\S+',re.U)
html_doc1="""
<article>
<uselesstag2>
<uselesstag1>
</uselesstag1>
</uselesstag2>
<topic>oil, gas</topic>
<body>body text</body>
</article>
<p>21.09.2009</p>
<p> </p>
<p1><img src="http://www.www.com/"></p1>
<p></p>
<!--- This article is about cars--->
<article>
<topic>cars</topic>
<body>body text</body>
</article>
"""
def nothing_inside(thing):
# select only tags to examine, leave comments/strings
try:
# check for img empty tags
if thing.name=='img' and thing['src']<>'':
return False
else:
pass
# check if any non-whitespace contents
for item in thing.contents:
if nonwhite.match(item):
return False
else:
pass
return True
except:
return False
def scrub(thing):
# loop function as long as an empty tag exists
while thing.find_all(nothing_inside,recursive=True) <> []:
for emptytag in thing.find_all(nothing_inside,recursive=True):
emptytag.extract()
scrub(thing)
return thing
soup=BeautifulSoup(html_doc1)
print scrub(soup)
结果:
<article>
<topic>oil, gas</topic>
<body>body text</body>
</article>
<p>21.09.2009</p>
<p1><img src="http://www.www.com/"/></p1>
<!--- This article is about cars--->
<article>
<topic>cars</topic>
<body>body text</body>
</article>
【讨论】:
以上是关于Beautifulsoup findall的主要内容,如果未能解决你的问题,请参考以下文章