beatifulsoup4 如何查找 class 里含多个值?

2015-07-26 22:57:04 +08:00
 bosshida

要爬tvsou里的节目单,例如: http://epg.tvsou.com/programys/TV_1/Channel_1/W1.htm。
<div class="tvgenre clear"> 这里开始是节目单内容,但我用bs4的find,findAll方法,怎样也无法提取到这个div。
尝试过:pmtlist = soup.findAll(True, {"class": re.compile(".*tvgenre.*")}) 找出来的是空的内容。找到一篇博客说多个值时作为列表处理。
试了:soup.findAll('div', class
=['tvgenre','clear']) 却找出一个含有clear,里面还有很多不相关的class值的div。
以上两个都失败了,实在没辙了,上来求救,如何才能获取到<div class="tvgenre clear">这个div。
或者有没别的可以方便的获取到节目单的API?

6593 次点击
所在节点    Python
11 条回复
lerry
2015-07-26 23:05:29 +08:00
楼主试试pyquery 可以像jquery那样操作,可以用 .tvgenre.clear 这个选择器
bosshida
2015-07-26 23:41:59 +08:00
@lerry 服务器是centos,不知为何装不了lxml,pyquery需要lxml。google一翻后仍然装不了lxml
ljcarsenal
2015-07-26 23:50:16 +08:00
soup.find(lambda tag:tag.name=="div" and "tvgenre clear" in tag.class)

不知道这样行不。。。
ljcarsenal
2015-07-26 23:51:40 +08:00
或者soup.find(lambda tag:tag.name=="div" and "tvgenre clear" in tag["class"]) 之类的 好久没有用过了
xifangczy
2015-07-27 01:26:17 +08:00
soup.find_all(attrs={'class':'tvgenre clear'})
tsingyi
2015-07-27 02:46:24 +08:00
仔细看读文档,里面有句话是这样的:

If you want to search for tags that match two or more CSS classes, you should use a CSS selector:

soup.select('div.tvgenre.clear')
bosshida
2015-07-27 10:04:04 +08:00
@ljcarsenal
@xifangczy
@tsingyi
几位的方法我都试过了,还是不行。len(result)结果为0,print出来是一个空的列表 []
WhiteLament
2015-07-27 10:33:01 +08:00
我试了下6楼的,好像没有问题啊

>>> r = requests.get('http://epg.tvsou.com/programys/TV_1/Channel_1/W1.htm')
>>> soup = BeautifulSoup(r.text, 'lxml').select('div.tvgenre.clear')[0]
>>> soup
<div class="tvgenre clear">……

有时候soup解析器会影响结果,但是这里lxml和默认的html.parser都没问题
xifangczy
2015-07-27 11:05:37 +08:00
@bosshida 看看完整代码,我测试了 直接传attrs是可以的.
bosshida
2015-07-27 15:33:47 +08:00
@WhiteLament
@xifangczy
def fetchContent(url, headers):
sleep(3)
resp = requests.get(url, headers = headers)
charset = resp.encoding
content = resp.text
print('charset:',charset)
#content = content.encode(charset).decode('gb18030')
soup = BeautifulSoup(content, 'html.parser')
div_node = soup.select('div.tvgenre.clear')
print div_node

我试过像@WhiteLament 那样在命令行打进去,也是获取失败
bosshida
2015-07-27 20:16:03 +08:00
问题解决了。应该是 html.parser 的问题。我现在用html5lib,可以了。
文档里写python 2.7以下的html.parser会有问题,我的是python 2.6版本。
谢谢各位。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208520

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX