【问题标题】:Find data within HTML tags using Python使用 Python 在 HTML 标记中查找数据
【发布时间】:2019-01-04 20:08:41
【问题描述】:

我想从网站上抓取以下 HTML 代码:

<td>Net Taxes Due<td>
<td class="value-column">$2,370.00</td>
<td class="value-column">$2,408.00</td>

我想要完成的是搜索页面以在标签中找到文本“Net Taxes Due”,找到标签的兄弟姐妹,并将结果发送到 Pandas 数据框。

我有以下代码:

soup = BeautifulSoup(url, "html.parser")
table = soup.select('#Net Taxes Due')

cells = table.find_next_siblings('td')
cells = [ele.text.strip() for ele in cells]

df = pd.DataFrame(np.array(cells))

print(df)

我一直在网上寻找解决方案,但无法提出任何建议。感谢任何帮助。

谢谢!

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    在下面我希望使用索引 1 和 2,但在使用 lxml.html 和 xpath 时,2 和 3 似乎可以工作

    import requests
    from lxml.html import fromstring
    # url = ''
    # tree = html.fromstring( requests.get(url).content)
    h = '''
    <td>Net Taxes Due<td>
    <td class="value-column">$2,370.00</td>
    <td class="value-column">$2,408.00</td>
    
    '''
    tree = fromstring(h)
    links = [link.text for link in tree.xpath('//td[text() = "Net Taxes Due"]/following-sibling::td[2] | //td[text() = "Net Taxes Due"]/following-sibling::td[3]' )]
    print(links)
    

    【讨论】:

      【解决方案2】:

      确保将标签名称与您的搜索字符串一起添加。你可以这样做:

      from bs4 import BeautifulSoup
      
      htmldoc = """
      <tr>
          <td>Net Taxes Due</td>
          <td class="value-column">$2,370.00</td>
          <td class="value-column">$2,408.00</td>
      </tr>
      """    
      soup = BeautifulSoup(htmldoc, "html.parser")
      item = soup.find('td',text='Net Taxes Due').find_next_sibling("td")
      print(item)
      

      【讨论】:

      • 我收到以下错误:“NoneType”对象没有属性“find_next_sibling”
      • 那你一定是用错误的方式处理东西。作为概念证明,请尝试执行上述 sn-p。
      • 谢谢!您的解决方案完美运行。原来我是个白痴,我从中提取的 URL 中有错误。难怪它没有返回任何值......
      【解决方案3】:

      您的.select() 呼叫不正确。选择器中的# 用于匹配元素的ID,而不是其文本内容,因此#Net 表示查找具有id="Net" 的元素。选择器中的空格意味着寻找匹配每个连续选择器的后代。所以#Net Taxes Due 搜索类似:

      <div id="Net">
          <taxes>
              <due>...</due>
          </taxes>
      </div>
      

      要搜索包含特定字符串的元素,请使用 .find()string 关键字:

      table = soup.find(string="Net Taxes Due")
      

      【讨论】:

      • 谢谢。我使用字符串运行它;但是,当我尝试查找该标签的兄弟姐妹时,我遇到了一个错误。 cells = table.find_next_siblings('td') AttributeError: 'NoneType' object has no attribute 'find_next_siblings'
      • 这意味着它没有找到Net Taxes Due 元素,所以find() 返回None
      • 这是在您修复网址之前还是之后?
      【解决方案4】:

      假设涉及到一个实际的 HTML 表格:

      <html>
      <table>
      <tr>
      <td>Net Taxes Due</td>
      <td class="value-column">$2,370.00</td>
      <td class="value-column">$2,408.00</td>
      </tr>
      </table>
      </html>
      
      soup = BeautifulSoup(url, "html.parser")
      table = soup.find('tr')
      df = [x.text for x in table.findAll('td', {'class':'value-column'})]
      

      【讨论】:

      • 查找列表理解。在这种情况下,x 代表 findAll 方法找到的每个单独的标签。
      【解决方案5】:

      这些应该可以工作。如果您使用的是 bs4 4.7.0,则“可以”使用 select。但是,如果您使用的是旧版本,或者只是更喜欢查找界面,则可以使用它。基本上如前所述,您不能使用# 引用内容,即ID。

      import bs4
      
      markup = """
      <td>Net Taxes Due</td>
      <td class="value-column">$2,370.00</td>
      <td class="value-column">$2,408.00</td>
      """
      
      # Version 4.7.0
      soup = bs4.BeautifulSoup(markup, "html.parser")
      cells = soup.select('td:contains("Net Taxes Due") ~ td.value-column')
      cells = [ele.text.strip() for ele in cells]
      print(cells)
      
      # Version < 4.7.0 or if you prefer find
      soup = bs4.BeautifulSoup(markup, "html.parser")
      cells = soup.find('td', text="Net Taxes Due").find_next_siblings('td')
      cells = [ele.text.strip() for ele in cells]
      print(cells)
      

      你会得到这个

      ['$2,370.00', '$2,408.00']
      ['$2,370.00', '$2,408.00']
      

      【讨论】:

        猜你喜欢
        • 2013-09-18
        • 1970-01-01
        • 2021-11-17
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        相关资源
        最近更新 更多