首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python漂亮汤级别1仅文本

Python漂亮汤级别1仅文本
EN

Stack Overflow用户
提问于 2014-04-24 13:46:22
回答 2查看 3.6K关注 0票数 3

我看过其他漂亮的汤也有同样的问题。好像我的有点不同。

这是http://engine.data.cnzz.com/main.php?s=engine&uv=&st=2014-03-01&et=2014-03-31网站

我想把那张桌子放在右边。注意表的第一行是如何展开成该数据的详细分解的。我不想要那些数据。我只想要最高级的数据。您还可以看到,其他行也可以展开,但在本例中是不行的。因此,只循环和跳过tr[2]可能不起作用。我试过这个:

代码语言:javascript
复制
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*。怎样才能拿到第一层呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-24 14:00:28

仅通过将table设置为False将搜索限制为指向 argument元素的子元素:

代码语言:javascript
复制
table = soup.find('div', class_='right1').table
rows = table.find_all('tr', {"class" : re.compile('list.*')}, recursive=False)
票数 8
EN

Stack Overflow用户

发布于 2014-04-24 14:14:36

@MartijnPieters的解决方案已经很完美了,但是不要忘记,BeautifulSoup允许您在定位元素时也使用多个属性。请参阅下列代码:

代码语言:javascript
复制
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;"的。这对于顶级行是唯一的,而不是内部行的属性。这与公认的答案是相同的结果:

代码语言:javascript
复制
百度汇总
360搜索
新搜狗
谷歌
微软必应
雅虎
0
有道
其他
[Finished in 2.6s]

希望这也有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23270805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档