Python beautifulsoup 只提取文本

3 投票
2 回答
3835 浏览
提问于 2025-04-18 04:05

我看过其他关于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)

撰写回答