【问题标题】:Extract data from an HTML tag which has specific attributes从具有特定属性的 HTML 标记中提取数据
【发布时间】:2016-08-26 05:34:08
【问题描述】:
<tr bgcolor="#FFFFFF">
    <td class="tablecontent" scope="row" rowspan="1">
        <a href="http://netprofile-us2/netprofile/npIndex.do?cpyKey=80823">ZURICH AMERICAN INSURANCE COMPANY</a>
    </td>
    <td class="tablecontent" scope="row" rowspan="1">
        FARMERS GROUP INC (14523)
    </td>
    <td class="tablecontent" scope="row">
        znaf
    </td>
    <td class="tablecontent" scope="row">
        anhm
    </td>
</tr>

我有一个包含多个 tr 标记的 HTML 文档。我想从第一个td 中提取href 链接,并从每个tr 标记下的第三个td 标记中提取数据。如何实现?

【问题讨论】:

  • 您是要获取具有特定属性的元素还是每个第 n 个元素?
  • 我想遍历所有 tr 标签并在同一行中只打印 标签的元素,直到我得到 标签。

标签: python python-2.7 beautifulsoup


【解决方案1】:

您可以找到所有tr 元素,对其进行迭代,然后针对内部td 元素进行特定于上下文的搜索并获得第一个和第三个:

for tr in soup.find_all('tr'):
    cells = tr.find_all('td')
    if len(cells) < 3:
        continue  # safety pillow

    link = cells[0].a['href']  # assuming every first td has an "a" element
    data = cells[2].get_text()

    print(link, data)

附带说明一下,根据您在 HTML 解析中要完成的工作,我通常会发现 pandas.read_html() 是一种将 HTML 表解析为 dataframes 并在之后使用数据帧的好方法,非常方便可以使用的数据结构。

【讨论】:

  • 我认为从第三到最后都想要,即[td.text for td in cells[2:]
  • 感谢您的宝贵时间。并非每个“tr”都有“a”标签。两个条件:- 第一个:“tr”标签开始。如果第一个“td”标签将有“a”标签,那么“a”标签将包含一个链接,“td”标签将包含文本,第二个“td”标签可能有文本(但不是必需的)。第三个“td”标签将包含文本。 “tr”标签结束。 “tr”标签现在开始,它将有“td”标签,但它可能有“a”标签或文本。我想提取“a”标签,它是第一个“td”标签中的文本和第三个“td”标签中的文本。现在如果下一个“tr.td”标签有文本然后是文本,都在一行中。如果下一个“tr.td”标签有“a”标签,那么它应该在第二行。
【解决方案2】:

您可以使用 css 选择器 nth-of-type 浏览 tds

这是一个示例"

soup = BeautifulSoup(html, 'html.parser')
a = soup.select('td:nth-of-type(1) a')[0]
href = a['href']
td = soup.select("td:nth-of-type(3)")[0]
text = td.get_text(strip=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多