我的输入将是任何没有固定HTML结构的Web文档。 我想做的是提取标题中的文本(可能是嵌套的)及其后续段落标签(可能是多个),并将它们成对输出。
一个简单的HTML示例可以是:
<h1>House rule</h1>
<h2>Rule 1</h2>
<p>A</p>
<p>B</p>
<h2>Rule 2</h2>
<h3>Rule 2.1</h3>
<p>C</p>
<h3>Rule 2.2</h3>
<p>D</p>
对于此示例,我想输出一对:
Rule 2.2, D
Rule 2.1, C
Rule 2, D
Rule 2, C
House rule, D
House rule, C
Rule 1, A B
.....依此类推。
我是Python的初学者,而且我知道Scrapy和BeautifulSoup广泛进行了网络抓取,在这种情况下,可能需要与XPath或代码相关的代码来识别同级标记。至于如何提取标题及其下段的输出对,显然是基于标签的相对顺序。 我不确定在这种情况下哪个库会更好,如果您可以向我展示如何实现它,那将真的很有帮助。谢谢!
答案 0 :(得分:0)
使用BeautifulSoup遍历树并收集<p>
标签级别不断提高的所有<h>
标签:
html = '''
<h1>House rule</h1>
<h2>Rule 1</h2>
<p>A</p>
<p>B</p>
<h2>Rule 2</h2>
<h3>Rule 2.1</h3>
<p>C</p>
<h3>Rule 2.2</h3>
<p>D</p>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,"lxml")
counter = 1
all_leafs = []
while True:
htag = 'h%d'%counter
hgroups = soup.findAll(htag)
print(htag,len(hgroups))
counter += 1
if len(hgroups) == 0:
break
for hgroup in hgroups:
for c,descendant in enumerate(hgroup.find_all_next()):
name = getattr(descendant, "name", None)
if name == 'p':
all_leafs.append((hgroup.getText(),descendant.getText()))
print(all_leafs)
...
h1 1
h2 2
h3 2
h4 0
[('House rule', 'A'), ('House rule', 'B'), ('House rule', 'C'), ('House rule', 'D'), ('Rule 1', 'A'), ('Rule 1', 'B'), ('Rule 1', 'C'), ('Rule 1', 'D'), ('Rule 2', 'C'), ('Rule 2', 'D'), ('Rule 2.1', 'C'), ('Rule 2.1', 'D'), ('Rule 2.2', 'D')]