Python beautifulsoup 只提取文本
我看过其他关于beautifulsoup获取同级数据的问题,感觉我的情况有点不同。
这是我正在查看的网站 http://engine.data.cnzz.com/main.php?s=engine&uv=&st=2014-03-01&et=2014-03-31
我想获取右边的那个表格。注意表格的第一行可以展开,显示更详细的数据。但我并不想要那些详细数据,我只想要最顶层的数据。你也可以看到其他行也可以展开,但在这种情况下并不需要。所以简单地循环并跳过 tr[2]
可能不太管用。我试过这个:
r = requests.get(page)
r.encoding = 'gb2312'
soup = BeautifulSoup(r.text,'html.parser')
table=soup.find('div', class_='right1').findAll('tr', {"class" : re.compile('list.*')})
但是在其他层级还有更多嵌套的 list*
。我该怎么才能只获取第一层的数据呢?
2 个回答
2
@MartijnPieters 的解决方案已经很完美了,但别忘了,BeautifulSoup
还允许你在查找元素时使用多个属性。看看下面的代码:
from bs4 import BeautifulSoup as bsoup
import requests as rq
import re
url = "http://engine.data.cnzz.com/main.php?s=engine&uv=&st=2014-03-01&et=2014-03-31"
r = rq.get(url)
r.encoding = "gb2312"
soup = bsoup(r.content, "html.parser")
div = soup.find("div", class_="right1")
rows = div.find_all("tr", {"class":re.compile(r"list\d+"), "style":"cursor:pointer;"})
for row in rows:
first_td = row.find_all("td")[0]
print first_td.get_text().encode("utf-8")
注意我还添加了 "style":"cursor:pointer;"
。这个属性是顶层行特有的,而不是内层行的属性。这和被接受的答案得出的结果是一样的:
百度汇总
360搜索
新搜狗
谷歌
微软必应
雅虎
0
有道
其他
[Finished in 2.6s]
希望这也能帮到你。
8
通过将 recursive
参数 设置为 False,可以限制你的搜索只在 table
元素的直接子元素中进行:
table = soup.find('div', class_='right1').table
rows = table.find_all('tr', {"class" : re.compile('list.*')}, recursive=False)