【问题标题】:web scraping without id没有id的网页抓取
【发布时间】:2019-03-25 04:21:56
【问题描述】:

我需要有关网页抓取的帮助。这是html示例:

<div class="content" name="content-name">
   <h2 class="Topic">First Topic</h2>
   <ul>
      <li>This Data 1</li>
      <li>This Data 2</li>
      <li>This Data 3</li>
   </ul>
   <h2 class="Topic">Second Topic</h2>
   <ul>
      <li>That Data 1</li>
      <li>That Data 2</li>
      <li>That Data 3</li>
   </ul>
   <h2 class="Topic">Third Topic</h2>
   <ul>
      <li>Their Data 1</li>
      <li>Their Data 2</li>
      <li>Their Data 3</li>
   </ul>
</div>

使用 BeautifulSoup,我可以获得 name="content-name" 的 html div 标签。但是,我如何在 h2 标签之后的 ul 中获取所有带有 li 标签的文本,其中包含“第二个主题”文本?因为所有这些都在同一个 div 标签中,没有特定的类、id 或名称。 提前致谢。

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:
    from bs4 import BeautifulSoup
    
    src = """
    <div class="content" name="content-name">
        <h2 class="Topic">First Topic</h2>
        <ul>
            <li>This Data 1</li>
            <li>This Data 2</li>
            <li>This Data 3</li>
        </ul>
        <h2 class="Topic">Second Topic</h2>
        <ul>
            <li>That Data 1</li>
            <li>That Data 2</li>
            <li>That Data 3</li>
        </ul>
        <h2 class="Topic">Third Topic</h2>
        <ul>
            <li>Their Data 1</li>
            <li>Their Data 2</li>
            <li>Their Data 3</li>
        </ul>
    </div>
    """
    
    soup = BeautifulSoup(src, 'lxml')
    
    content = soup.find_all("div", class_="content")[0]
    
    
    second_topic = content.find_all("h2", class_="Topic", string="Second Topic")[0]
    
    ul = second_topic.next_sibling.next_sibling
    
    li = ul.find_all("li")
    for i in li:
        print(i.string)
    

    【讨论】:

    • 我更喜欢 ul = second_topic.find_next_sibling('ul') 更健壮的
    • 除此之外,我更喜欢你的解决方案
    • 你是对的,不知道为什么我使用下一个兄弟,我想我只是想让 OP 知道它的存在
    • 我的解决方案相当粗糙,并不是你在实践中会写的(创建了这么多变量)。我只是想向他展示它是如何工作的
    • 我的意思是我更喜欢在搜索 ul(这是你的)之前找到好的 h2 的解决方案
    【解决方案2】:

    标签没有id、类或父标签时总是比较困难的。

    您可以使用find_previous_sibling

    from bs4 import BeautifulSoup
    html = """
    <div class="content" name="content-name">
       <h2 class="Topic">First Topic</h2>
       <ul>
          <li>This Data 1</li>
          <li>This Data 2</li>
          <li>This Data 3</li>
       </ul>
       <h2 class="Topic">Second Topic</h2>
       <ul>
          <li>That Data 1</li>
          <li>That Data 2</li>
          <li>That Data 3</li>
       </ul>
       <h2 class="Topic">Third Topic</h2>
       <ul>
          <li>Their Data 1</li>
          <li>Their Data 2</li>
          <li>Their Data 3</li>
       </ul>
    </div>
    """
    soup = BeautifulSoup(html, 'html.parser')
    
    for ul in soup.find_all('ul'):
        if ul.find_previous_sibling('h2').text == 'Second Topic':
            for li in ul.find_all('li'):
                print(li.text)
    

    返回

    That Data 1
    That Data 2
    That Data 3
    

    【讨论】:

    • 你是说 find_next_sibling 吗?
    • @laurentiuskevin 不
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2020-06-18
    • 2021-05-29
    • 2021-07-19
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多