Python beautifulsoup 1级唯一文本

时间:2014-04-24 13:46:23

标签: python 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 个答案:

答案 0 :(得分:7)

通过将recursive argument设置为False,将搜索范围限制为table元素的直接子元素:

table = soup.find('div', class_='right1').table
rows = table.find_all('tr', {"class" : re.compile('list.*')}, recursive=False)

答案 1 :(得分:1)

@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]

希望这也有帮助。