通过哪个库以及如何通过标题和段落标记在HTML上抓取文本?

2023-01-27 21:36:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的输入将是没有固定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的初学者,我知道web scraping是由Scrapy和BeautifulSoup广泛完成的,在这种情况下,可能需要使用XPath或代码来识别同级标记。至于如何提取标题及其以下段落的输出对,显然是基于标签的相对顺序。 我不确定在这种情况下使用哪个库会更好,如果您能告诉我如何实现它,那将非常有帮助。谢谢!你知道吗


Tags: 文档文本web标题示例html情况h2h1rule结构h3house段落标记
1条回答
网友
1楼 · 发布于 2023-01-27 21:36:02

遍历树并收集所有<p>标记(这些标记的级别越来越高)<h>可以使用BeautifulSoup完成:

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')]

相关问题 更多 >