【问题标题】:How to scrape the different content with the same html attributes and values?如何使用相同的 html 属性和值抓取不同的内容?
【发布时间】:2026-01-11 21:50:01
【问题描述】:

我能够从网页中抓取大量数据,但我正在努力从具有完全相同属性和值的小节中提取特定内容。这是html:

   <li class="highlight">
     Relationship Issues
      </li>
   <li class="highlight">
     Depression
      </li>
   <li class="highlight">
     Spirituality
      </li>

                                            <li class="">
                                                           ADHD
                                                   </li>
                                           <li class="">
                                                           Alcohol Use
                                                   </li>
                                           <li class="">
                                                           Anger Management
                                                   </li>

使用该 html 作为参考,我有以下内容:

import requests
from bs4 import BeautifulSoup
import html5lib
import re

headers = {'User-Agent': 'Mozilla/5.0'}
URL = "website.com"


page = requests.get(URL, headers=headers)

soup = BeautifulSoup(page.content, 'html5lib')

specialties = soup.find_all('div', {'class': 'spec-list attributes-top'})

for x in specialties:
   Specialty_1 = x.find('li', {'class': 'highlight'}).text
   Specialty_2 = x.find('li', {'class': 'highlight'}).text
   Specialty_3 = x.find('li', {'class': 'highlight'}).text

所以理想的结果是:Specialty_1 = 关系问题; Specialty_2 = 抑郁症; Specialty_3 = 灵性

问题 1 = 多动症;问题_2 = 饮酒; Issue_3 = 愤怒管理

不胜感激!

【问题讨论】:

  • 我认为我们需要看到更多的 html。目前,您只需选择第一个 li(如果存在)3 次。您真的想要对 li 元素列表进行循环。可以分享一下网址吗?由于当前设置了循环,您还将覆盖循环内的变量。
  • 我遇到的问题是后面有几个 li 有我想要的没有值的数据。我该如何解决?
  • 您要求提供这 3 个值。我已将其放在答案的下半部分。请问您还需要从那个页面获得什么?#
  • @QHarr 我添加了一些带有 li 属性但没有值的 HTML,您如何识别这些?您的代码非常适合 li.highlight

标签: python html web-scraping beautifulsoup html5lib


【解决方案1】:

您可以开发 Andrej 的字典理念并使用 if else 基于存在的类来确定前缀并扩展选择以包含附加部分。您需要重置新部分的编号,例如带着旗帜

results = {}
flag = False
counter = 1

for j in soup.select(".specialties-list li, .attributes-issues li"):
    if j['class']:
        results[f'Specialty_{counter}'] =  j.text.strip()
    else:   
        if not flag:
            counter = 1
            flag = True
        results[f'Issue_{counter}'] = j.text.strip()
    counter +=1 
        
print(results)

【讨论】:

    【解决方案2】:

    如果您知道 xpath 将位于树中的相同元素结构中,则可以使用它。大多数情况下,您可以右键单击 chrome devtools 中的元素来获取选择器和 xpath 字符串。

    【讨论】:

      【解决方案3】:

      如果您想要可变数量的变量,请使用字典。例如:

      from bs4 import BeautifulSoup
      
      
      html_doc = '''   <li class="highlight">
           Relationship Issues
            </li>
         <li class="highlight">
           Depression
            </li>
         <li class="highlight">
           Spirituality
            </li>
      '''
      
      soup = BeautifulSoup(html_doc, 'html.parser')
      
      out = {'Specialty_{}'.format(i): specialty.get_text(strip=True) for i, specialty in enumerate(soup.select("li.highlight"), 1)}
      
      print(out)
      

      打印:

      {'Specialty_1': 'Relationship Issues', 
       'Specialty_2': 'Depression', 
       'Specialty_3': 'Spirituality'}
      

      【讨论】:

        最近更新 更多