我看了另一个美女汤得到同级别的问题。好像我的情况略有不同。
这是网站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*
。如何只获得第一级?
答案 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]
希望这也有帮助。