python - Beautifulsoup 无法找到名称中带有连字符的类

标签 python python-2.7 web-scraping beautifulsoup html-parsing

我在运行 Python 2.7.8 的 MacOSX 上使用 BeautifulSoup4。我很难从以下 html 代码中提取信息

 <tbody tabindex="0" class="yui-dt-data" id="yui_3_5_0_1_1408418470185_1650">
      <tr id="yui-rec0" class="yui-dt-first yui-dt-even">
           <td headers="yui-dt0-th-rank" class="rank yui-dt0-col-rank"></td>
           </tr>
      <tr id="yui-rec1" class="yui-dt-odd">...</tr>
      <tr id="yui-rec2" class="yui-dt-even">...</tr>
 </tbody>

我似乎无法获取表格或其中的任何内容,因为 BS 和/或 python 似乎无法识别带有连字符的值。所以通常的代码,比如

 Table = soup.find('tbody',{'class':'yui-dt-data'})

 Row2 = Table.find('tr',{'id':'yui-rec2'})

只返回一个空对象(不是 NONE,只是空对象)。我不是 BS4 或 Python 的新手,之前我已经从该站点提取信息,但现在的类名与我以前做的时候不同。现在一切都有连字符。有没有办法让 Python 识别连字符或解决方法?

我需要让我的代码具有通用性,以便我可以在所有具有相同类名的多个页面上运行它。不幸的是,id <tbody> 中的属性对于那个特定的表是唯一的,所以我不能用它来跨网页识别这个表。

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

以下代码:

from bs4 import BeautifulSoup

htmlstring = """ <tbody tabindex="0" class="yui-dt-data" id="yui_3_5_0_1_1408418470185_1650">
      <tr id="yui-rec0" class="yui-dt-first yui-dt-even">
      <tr id="yui-rec1" class="yui-dt-odd">
      <tr id="yui-rec2" class="yui-dt-even">"""


soup = BeautifulSoup(htmlstring)
Table = soup.find('tbody', attrs={'class': 'yui-dt-data'}) 
print("Table:\n")
print(Table)
tr = Table.find('tr', attrs={'class': 'yui-dt-odd'}) 
print("tr:\n")
print(tr)

输出:

Table:

<tbody class="yui-dt-data" id="yui_3_5_0_1_1408418470185_1650" tabindex="0">
<tr class="yui-dt-first yui-dt-even" id="yui-rec0">
<tr class="yui-dt-odd" id="yui-rec1">
<tr class="yui-dt-even" id="yui-rec2"></tr></tr></tr></tbody>
tr:

<tr class="yui-dt-odd" id="yui-rec1">
<tr class="yui-dt-even" id="yui-rec2"></tr></tr>

即使您提供的 html 本身无效,BS 似乎也在猜测它应该如何,因为 soup.pretify() 产生

<tbody class="yui-dt-data" id="yui_3_5_0_1_1408418470185_1650" tabindex="0">
 <tr class="yui-dt-first yui-dt-even" id="yui-rec0">
  <tr class="yui-dt-odd" id="yui-rec1">
   <tr class="yui-dt-even" id="yui-rec2">
   </tr>
  </tr>
 </tr>
</tbody>

虽然我猜那些 tr 不应该被嵌套。

你能试着运行那个确切的代码并看看输出是什么吗?

关于python - Beautifulsoup 无法找到名称中带有连字符的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375351/

相关文章:

python - 为什么 "%-d"或 "%-e"删除前导空格或零?

python - Scrapy Xpath 输出为空

python - 使用 top 生成每个内核的 Linux CPU 信息报告

python - 如何在新终端的 python 中运行 linux 终端命令

python - 如何使用 python-docx 在文本中设置语言

python - 在python中转置数据

python - 元组中的总和值(字典中的值)

python - 将图像设置为单选按钮 - 防止垃圾收集器删除图像引用

html - 使用 VBA 面临错误从网站中提取超链接

python - 在python中使用bs4从网站的不同链接获取律师详细信息