如何迭代HTML文件并将特定数据解析为Dataframe?

How to iterate HTML file and parse specific data to Dataframe?

提问人: 提问时间:1/9/2023 最后编辑:HedgeHog 更新时间:1/9/2023 访问量:40

问:

我已经查看了从XML解析器到XML解析器的各种方法,我认为必须有一种更简单的方法来遍历HTML文件以将信息解析为数据帧表。有很多关于特定章节标题的信息:BeautifulSoup

<h2 class="chapter-header-western">CHAPTER 1</h2>
    <p class="western" style="line-height: 100%; margin-bottom: 0.08in"><b>1</b>text
    <p class="western" style="line-height: 100%; margin-bottom: 0.08in"><b>Header</b></p>
    <p align="left" style="line-height: 100%; margin-bottom: 0.08in"><b>2</b>text
    </p>
    <p align="left" style="line-height: 120%; margin-left: 0.3in; text-indent: -0.3in; margin-bottom: 0.08in">
    <b>3 </b>text
    </p>
    <p class="western" style="line-height: 100%; margin-bottom: 0.08in">text <b>4 </b>text
    <b>5 </b>text<b>6 </b>text
    </p>

从 docx 文件转换的 html 有点混乱,但我需要做的就是将粗体数字后面的每段文本解析到它自己的行中:<b>#</b>

发短信
1 1 发短信
1 2 发短信
1 3 发短信

也许我需要制作一个标签作为描述?<b>#</b>

我尝试使用 BeautifulSoup find_all但这只返回标签之间的字符串,我需要一种方法来返回一组标签后面的文本。

python 数据帧 web-scraping beautifulsoup html-解析

评论


答:

0赞 HedgeHog 1/9/2023 #1

根据您的示例,您可以选择所有元素并检查文本是否 - 使用并从左侧和右侧选择必要的信息:<b>isnumeric()find_previous()next_sibling

for e in soup.select('b'):
    if e.get_text(strip=True).isnumeric():
        data.append({
            'chapter': e.find_previous('h2').get_text(strip=True).split()[-1],
            'number': e.get_text(strip=True),
            'text': e.next_sibling.strip() if e.next_sibling else None
        })

from bs4 import BeautifulSoup
html = '''
<h2 class="chapter-header-western">CHAPTER 1</h2>
    <p class="western" style="line-height: 100%; margin-bottom: 0.08in"><b>1</b>text
    <p class="western" style="line-height: 100%; margin-bottom: 0.08in"><b>Header</b></p>
    <p align="left" style="line-height: 100%; margin-bottom: 0.08in"><b>2</b>text
    </p>
    <p align="left" style="line-height: 120%; margin-left: 0.3in; text-indent: -0.3in; margin-bottom: 0.08in">
    <b>3 </b>text
    </p>
    <p class="western" style="line-height: 100%; margin-bottom: 0.08in">text <b>4 </b>text
    <b>5 </b>text<b>6 </b>text
    </p>
'''
soup = BeautifulSoup(html)

data = []

for e in soup.select('b'):
    if e.get_text(strip=True).isnumeric():
        data.append({
            'chapter': e.find_previous('h2').get_text(strip=True).split()[-1],
            'number': e.get_text(strip=True),
            'text': e.next_sibling.strip() if e.next_sibling else None
        })

pd.DataFrame(data)

输出

发短信
0 1 1 发短信
1 1 2 发短信
2 1 3 发短信
3 1 4 发短信
4 1 5 发短信
5 1 6 发短信