我在运行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>
属性对于该特定表是唯一的,因此我不能使用它来跨网页识别此表。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:2)
以下代码:
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.prettify()
产生
<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>
虽然我猜测那些人不应该嵌套。
你能尝试运行那个确切的代码并查看输出是什么吗?
答案 1 :(得分:0)
对于试图找到在属性中带有连字符的标签的解决方案的人们,文档中有一个答案 https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-keyword-arguments
这部分代码将导致错误
data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')
data_soup.find_all(data-foo="value")
# SyntaxError: keyword can't be an expression
您应该这样做
data_soup.find_all(attrs={"data-foo": "value"})
# [<div data-foo="value">foo!</div>]
答案 2 :(得分:0)
只需使用select
import requests
from bs4 import BeautifulSoup as bs
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>
'''
soup = bs(html, 'lxml')
soup.select('.yui-dt-data')