【问题标题】:Is there a way to get HTML divisions of a given class that must necessarily be contiguous?有没有办法让给定类的 HTML 分区必须是连续的?
【发布时间】:2020-03-30 02:08:14
【问题描述】:

我的问题是,在类似下面示例的情况下,我需要在 class=cls_003 中获取 TEXT#1 和 TEXT#2 并将它们存储为单独的字符串。我目前正在使用 Python、BeautifulSoup 和正则表达式打开网页,并使用 re.findall 获取所需的 div,然后使用 BeautifulSoup 获取文本。 有更好的方法吗?

我要抓取的 HTML 页面:

<div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #1---</span></div>
<div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #1---</span></div>

<div style="yyyy" class="cls_007"><span class="cls_007">----UNNECESSARY TEXT---</span></div>
<div style="yyyy" class="cls_007"><span class="cls_007">----UNNECESSARY TEXT---</span></div>class="cls_009">'r'End</span></div>

<div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #2---</span></div>
<div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #2---</span></div>
</div>class="cls_009">'r'End</span></div>

我目前正在运行的 Python 代码

soup_string = str(soup)

results = re.findall(r'(?m)<div style="xxxx" class="cls_003">.*?class="cls_009">'
                             r'End</span></div>', soup_string, flags=re.S)

soup2 = BeautifulSoup(results, features="lxml")
for result in results:
    result_parsed = soup2.findAll("div", {"class": "cls_003"})
    for q in result_parsed:
        print(q.text)
    print('\n')

【问题讨论】:

    标签: python html regex web-scraping


    【解决方案1】:

    您不需要使用正则表达式。这是我的解决方案:

    from bs4 import BeautifulSoup
    
    doc = '''<div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #1---</span></div>
    <div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #1---</span></div>
    
    <div style="yyyy" class="cls_007"><span class="cls_007">----UNNECESSARY TEXT---</span></div>
    <div style="yyyy" class="cls_007"><span class="cls_007">----UNNECESSARY TEXT---</span></div>class="cls_009">'r'End</span></div>
    
    <div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #2---</span></div>
    <div style="xxxx" class="cls_003"><span class="cls_003">----TEXT #2---</span></div>
    </div>class="cls_009">'r'End</span></div>'''
    
    soup = BeautifulSoup(doc, features="html.parser")
    results = soup.findAll("div", {"class": "cls_003"})
    resultsList = []
    for result in results:
        resultsList.append(result.text)
    
    print(f'Result set 1: {resultsList[0]+resultsList[1]}')
    print(f'Result set 2: {resultsList[2]+resultsList[3]}')
    

    【讨论】:

    • 感谢您的回答。你是对的,但问题是我需要 TEXT#1 和 TEXT#2 作为单独的字符串。把它们放在一起并不是我想要的。
    • 单独的文本是什么意思?如何将它们分开才能满足需求?
    • 注意cls_003开头有两个div,结尾有两个。我需要将前两个 cls_003 div 中的文本连接起来并单独存储。然后我需要将最后两个 cls_003 div 中的文本连接起来并单独存储为另一个字符串。
    • @StephenKingston 我已经更新了代码。现在它会创建一个包含所有结果的列表,然后按照您要求的方式连接起来。
    • 哈哈...感谢您付出的努力。但它应该适用于更一般的情况 - 它不一定是 2 个 cls_003 div 在一个地方。可能是任意数量的 cls_003 div,它应该仍然可以工作。
    猜你喜欢
    • 2013-10-15
    • 2021-10-07
    • 2021-06-29
    • 2017-01-20
    • 2021-09-11
    • 2016-06-05
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多