要爬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?
1
lerry 2015-07-26 23:05:29 +08:00 via iPhone
楼主试试pyquery 可以像jquery那样操作,可以用 .tvgenre.clear 这个选择器
|
2
bosshida OP @lerry 服务器是centos,不知为何装不了lxml,pyquery需要lxml。google一翻后仍然装不了lxml
|
3
ljcarsenal 2015-07-26 23:50:16 +08:00
|
4
ljcarsenal 2015-07-26 23:51:40 +08:00
或者soup.find(lambda tag:tag.name=="div" and "tvgenre clear" in tag["class"]) 之类的 好久没有用过了
|
5
xifangczy 2015-07-27 01:26:17 +08:00
soup.find_all(attrs={'class':'tvgenre clear'})
|
6
tsingyi 2015-07-27 02:46:24 +08:00 via iPhone
仔细看读文档,里面有句话是这样的:
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') |
7
bosshida OP |
8
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都没问题 |
10
bosshida OP @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 那样在命令行打进去,也是获取失败 |
11
bosshida OP 问题解决了。应该是 html.parser 的问题。我现在用html5lib,可以了。
文档里写python 2.7以下的html.parser会有问题,我的是python 2.6版本。 谢谢各位。 |