【问题标题】:BeautifulSoup find text in specific tagBeautifulSoup 在特定标签中查找文本
【发布时间】:2018-10-11 23:44:29
【问题描述】:

使用 BeautifulSoup,我正在尝试打印特定标签内的文本,问题是我要打印的文本位于 <tr> 标签内的标签内,而网页有 30 个 <tr> 标签。 我需要打印的文本位于 <tr> 标签第 19 次出现内的第二个 <td> 标签中。 它看起来像这样:

<tr>...</tr>
<tr>...</tr>
<tr>
    <td class="QL">Text1</td>
    <td class="QL">Text2</td>
    <td class="QL">Text3</td>
</tr>
<tr>...</tr>
<tr>...</tr>

我想打印 Text2。

这是我的尝试:

from urllib.request import urlopen
from bs4 import BeautifulSoup
quote_page = 'http://google.com'
page = urlopen(quote_page)
soup = BeautifulSoup(page, 'html.parser')
for link in soup.find("td", {"class": "QL"}):
    print(link)

事实上,它正在打印&lt;td class="QL"&gt; 标签的第一次出现。如何让它在该标签的第 19 次出现内打印文本,而不打印 Text1 和 Text3?

【问题讨论】:

  • 你需要soup.findAll

标签: python beautifulsoup


【解决方案1】:

当您知道要查找的标签的确切位置时,您可以使用find_all(),它返回一个列表,然后从所需的索引中获取标签。

在这种情况下,(第 19 个&lt;tr&gt; 和第 2 个&lt;td&gt;)使用这个:

result = soup.find_all('tr')[18].find_all('td')[1].text

【讨论】:

  • 谢谢,它工作得很好。但是,我现在使用它从多个页面中获取文本,这些页面的结构大多相同,但时不时有一个页面的文本不在同一个位置,它返回索引错误IndexError: list index out of range。索引错误会阻止代码继续运行,我该如何避免这种情况(例如返回空白结果)?
  • 使用try-except。如果您不知道这个概念,只需谷歌它。你会更好地理解它。
  • 谢谢,我用谷歌搜索并成功实现了它,就像一个魅力。
【解决方案2】:

您可以将enumeratefind_all 一起使用:

result = [a.text for i, a in enumerate(soup.find_all("td", {"class": "QL"}), start=1) if i == 19][0]

【讨论】:

    【解决方案3】:

    可以这样。

    result = [ x.text for x in soup.select('tr > td:nth-of-type(2)')]
    

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2013-12-17
      • 1970-01-01
      • 2010-10-26
      • 2014-05-09
      相关资源
      最近更新 更多