【问题标题】:Parsing webpage with robobrowser and beautifulsoup使用 robobrowser 和 beautifulsoup 解析网页
【发布时间】:2016-11-25 18:50:57
【问题描述】:

我是网络抓取的新手,在使用 robobrowser 提交表单后尝试解析网站。我得到了正确的数据(当我这样做时我可以查看它:print(browser.parsed))但在解析它时遇到了麻烦。网页源代码的相关部分如下所示:

<div id="ii">
<tr>
  <td scope="row" id="t1a"> ID (ID Number)</a></td>
  <td headers="t1a">1234567 &nbsp;</td>
</tr>
<tr>
  <td scope="row" id="t1b">Participant Name</td>
  <td headers="t1b">JONES, JOHN                          &nbsp;</td>
</tr>
<tr>
  <td scope="row" id="t1c">Sex</td>
  <td headers="t1c">MALE   &nbsp;</td>
</tr>
<tr>
  <td scope="row" id="t1d">Date of Birth</td>
  <td headers="t1d">11/25/2016 &nbsp;</td>
</tr>
<tr>
  <td scope="row" id="t1e">Race / Ethnicity</a></td>
  <td headers="t1e">White                  &nbsp;</td>
</tr>

如果我这样做

in: browser.select('#t1b")

我明白了:

out: [<td id="t1b" scope="row">Inmate Name</td>]

而不是 JONES,JOHN。

我能够获得相关数据的唯一方法是:

browser.select('tr')

这会返回 29 个列表中的每一个,每个 'tr' 我可以将其转换为文本并搜索相关信息。

我也尝试过创建 BeautifulSoup 对象:

x = browser.select('#ii')
soup = BeautifulSoup(x[0].text, "html.parser")

但它会丢失所有标签/ID,所以我不知道如何在其中搜索。

有没有一种简单的方法让它使用 'tr' 遍历每个元素并获取实际数据而不是标签,以反对重复转换为字符串变量并通过它进行搜索?

谢谢

【问题讨论】:

    标签: python web-scraping beautifulsoup robobrowser


    【解决方案1】:

    获取所有“标签”td 元素并获取next td sibling value 收集结果到字典中:

    from pprint import pprint
    from bs4 import BeautifulSoup
    
    data = """
    <table>
        <tr>
          <td scope="row" id="t1a"> ID (ID Number)</a></td>
          <td headers="t1a">1234567 &nbsp;</td>
        </tr>
        <tr>
          <td scope="row" id="t1b">Participant Name</td>
          <td headers="t1b">JONES, JOHN                          &nbsp;</td>
        </tr>
        <tr>
          <td scope="row" id="t1c">Sex</td>
          <td headers="t1c">MALE   &nbsp;</td>
        </tr>
        <tr>
          <td scope="row" id="t1d">Date of Birth</td>
          <td headers="t1d">11/25/2016 &nbsp;</td>
        </tr>
        <tr>
          <td scope="row" id="t1e">Race / Ethnicity</a></td>
          <td headers="t1e">White                  &nbsp;</td>
        </tr>
    </table>
    """
    
    soup = BeautifulSoup(data, 'html5lib')
    
    data = {
        label.get_text(strip=True): label.find_next_sibling("td").get_text(strip=True)
        for label in soup.select("tr > td[scope=row]")
    }
    pprint(data)
    

    打印:

    {'Date of Birth': '11/25/2016',
     'ID (ID Number)': '1234567',
     'Participant Name': 'JONES, JOHN',
     'Race / Ethnicity': 'White',
     'Sex': 'MALE'}
    

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2018-05-11
      • 2020-02-25
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多