使用Beautifulsoup和Python提取Beautifulsoup HTML数据

使用Beautifulsoup和Python提取Beautifulsoup HTML数据,python,html,xml,xml-parsing,beautifulsoup,Python,Html,Xml,Xml Parsing,Beautifulsoup,我的HTML文本看起来像以下结构的许多实例: <DOC> <DOCNO> XXX-2222 </DOCNO> <FILEID>AP-NR-02-12-88 2344EST</FILEID> <HEAD>Reports Former Saigon Officials Released from Re-education Camp</HEAD> <TEXT> Lots of text here </

我的HTML文本看起来像以下结构的许多实例:

<DOC>
<DOCNO> XXX-2222 </DOCNO>
<FILEID>AP-NR-02-12-88 2344EST</FILEID>
<HEAD>Reports Former Saigon Officials Released from Re-education Camp</HEAD>
<TEXT>
Lots of text here
</TEXT>
</DOC>
但这仅给出以下格式的结果:

<docno> AP880212-0166 </docno>, <docno> AP880212-0167 </docno>, <docno> AP880212-0168 </docno>, <docno> AP880212-0169 </docno>, <docno> AP880212-0170 </docno>
AP880212-0166、AP880212-0167、AP880212-0168、AP880212-0169、AP880212-0170
如何提取数据中的数字?把它们和标题和文字联系起来

多谢各位

萨沙

类似这样:

html = """<DOC>
<DOCNO> XXX-2222 </DOCNO>
<FILEID>AP-NR-02-12-88 2344EST</FILEID>
<HEAD>Reports Former Saigon Officials Released from Re-education Camp</HEAD>
<TEXT>
Lots of text here
</TEXT>
</DOC>
"""

import bs4

d = {}

soup = bs4.BeautifulSoup(html, features="xml")
docs = soup.findAll("DOC")
for doc in docs:
    d[doc.DOCNO.getText()] = (doc.HEAD.getText(), doc.TEXT.getText())

print d
#{u' XXX-2222 ': 
#   (u'Reports Former Saigon Officials Released from Re-education Camp', 
#    u'\nLots of text here\n')}
因此,您可以在文件中执行此操作,或者我建议您在将输入文本传递给beautifulsoup之前以编程方式执行此操作:

root_element_name = "XMLROOT"  # this can be anything
rooted_html = "<{0}>\n{1}\n</{0}>".format(root_element_name, html)
soup = bs4.BeautifulSoup(rooted_html, features="xml")
root_element_name=“XMLROOT”#这可以是任何内容
根元素html=“\n{1}\n”。格式(根元素名称,html)
soup=bs4.BeautifulSoup(root_html,features=“xml”)
类似这样的内容:

html = """<DOC>
<DOCNO> XXX-2222 </DOCNO>
<FILEID>AP-NR-02-12-88 2344EST</FILEID>
<HEAD>Reports Former Saigon Officials Released from Re-education Camp</HEAD>
<TEXT>
Lots of text here
</TEXT>
</DOC>
"""

import bs4

d = {}

soup = bs4.BeautifulSoup(html, features="xml")
docs = soup.findAll("DOC")
for doc in docs:
    d[doc.DOCNO.getText()] = (doc.HEAD.getText(), doc.TEXT.getText())

print d
#{u' XXX-2222 ': 
#   (u'Reports Former Saigon Officials Released from Re-education Camp', 
#    u'\nLots of text here\n')}
因此,您可以在文件中执行此操作,或者我建议您在将输入文本传递给beautifulsoup之前以编程方式执行此操作:

root_element_name = "XMLROOT"  # this can be anything
rooted_html = "<{0}>\n{1}\n</{0}>".format(root_element_name, html)
soup = bs4.BeautifulSoup(rooted_html, features="xml")
root_element_name=“XMLROOT”#这可以是任何内容
根元素html=“\n{1}\n”。格式(根元素名称,html)
soup=bs4.BeautifulSoup(root_html,features=“xml”)

获取标签内容:

docnos = soup.findAll('docno')
for docno in docnos:
    print docno.contents[0]

要获取标记的内容,请执行以下操作:

docnos = soup.findAll('docno')
for docno in docnos:
    print docno.contents[0]
您还可以使用
renderContents()
从标记中提取信息



您还可以使用
renderContents()
从标记中提取信息。

如果我想从目录中读取一系列.html文件?目前我正在为glob.glob(os.path.join(path,'.*.html'))中的infle做path='/TREC-AP88-90-qrels1-50/Docs':soup=beautifulsou(file(infle.read(),features=“xml”),然后是你的代码,但它没有给我正确的结果。事实上,正是“xml”部分让它在第一个doc之后停止。。有什么办法吗?@user2070177查看我的更新。我用多个文档对它进行了测试,效果很好。@user2070177您可以将此代码包装在一个函数中,该函数接受原始html文本并返回字典;返回dict,然后可以使用
dict.update(..)
将其聚合到主词典中(在主目录/文件迭代循环的范围内)。这是一个更干净、更好的分离设计。如果我想从一个目录中读取一系列.html文件呢?目前我正在为glob.glob(os.path.join(path,'.*.html'))中的infle做path='/TREC-AP88-90-qrels1-50/Docs':soup=beautifulsou(file(infle.read(),features=“xml”),然后是你的代码,但它没有给我正确的结果。事实上,正是“xml”部分让它在第一个doc之后停止。。有什么办法吗?@user2070177查看我的更新。我用多个文档对它进行了测试,效果很好。@user2070177您可以将此代码包装在一个函数中,该函数接受原始html文本并返回字典;返回dict,然后可以使用
dict.update(..)
将其聚合到主词典中(在主目录/文件迭代循环的范围内)。这是一个更干净、更好的分离设计。如果我想链接文档编号、标题和文档,您可以迭代
soup.findAll('doc')
,在迭代
soup.findAll('docno')
之前收集所需的标记内容,并在第一个循环中创建键,在第二个循环中建立值。也就是说,有一个嵌套的循环(不是一个附加的循环)。也考虑使用<代码> BeautifulStoneSoup < /代码>,因为这是XML。它很容易使用(就像BeautifulSoup一样)。从BeautifulSoup导入BeautifulStoneSoup
,并完全按照您的意愿使用它ordinarily@That1Guy
bs4
中不推荐使用
BeautifulStoneSoup
。我承认这也是我第一次尝试的:)。它已被传递给
features=“xml”
kwarg到
BeautifulSoup
构造函数所取代。@PreetKukreti完全正确。我觉得OP使用的是BeautifulSoup 3(
findAll
vs
find\u all
)。谢谢你的更正。我个人使用3,因为我发现bs4有点问题。如果我想链接文档编号、标题和文档?你可以迭代
soup.findAll('doc')
,在迭代
soup.findAll('docno')
之前收集你想要的标记内容,并在第一个循环中创建键,在第二个循环中建立值。也就是说,有一个嵌套的循环(不是一个附加的循环)。也考虑使用<代码> BeautifulStoneSoup < /代码>,因为这是XML。它很容易使用(就像BeautifulSoup一样)。从BeautifulSoup导入BeautifulStoneSoup
,并完全按照您的意愿使用它ordinarily@That1Guy
bs4
中不推荐使用
BeautifulStoneSoup
。我承认这也是我第一次尝试的:)。它已被传递给
features=“xml”
kwarg到
BeautifulSoup
构造函数所取代。@PreetKukreti完全正确。我觉得OP使用的是BeautifulSoup 3(
findAll
vs
find\u all
)。谢谢你的更正。我个人使用3,因为我发现bs4有点问题。