• 全部
  • 互动交流
  • 文章分享

请教大家一个关于爬虫爬取网站的问题。

FoxFiled 2020-05-20 10:59:51
我用python写了一个爬取水木社区(http://www.newsmth.net/nForum/#!board/Python?p=1)的爬虫,来爬取这一页的每个帖子的链接,我用浏览器查看了每个帖子的链接放在<td class='title_9'> <td>和<td class='title_9 bg-odd'> <td>这样的标签里。我使用td=tbody.find_all('td',class_='title_9')可以返回所有class='title_9'和class='title_9 bg-odd'的所有帖子,为什么class='title_9 bg-odd'的帖子也能找到? 我使用td=tbody.find_all('td',class_='title_9 bg-odd')时,却返回空,一个帖子也找不到。然后我print(tbody)把tbody的内容打印出来,发现打印出来的所有帖子都在<td class='title_9'> <td>里面,所有的class='title_9 bg-odd'都变成了class='title_9'了,为什么会这样呢?为什么程序打印出来的tbody的内容和在浏览器上看到的不一样?求大神帮忙解答一下,谢谢啦。
浏览器看到的:

程序输出的:
...全文
430 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
引用 15 楼 FoxFiled的回复:
[quote=引用 14 楼 糊里糊涂的一锅粥 的回复:] [quote=引用 13 楼 FoxFiled的回复:][quote=引用 12 楼 糊里糊涂的一锅粥 的回复:] [quote=引用 11 楼 FoxFiled 的回复:]
text.html是我抓下来页面保存的成了文件,读取这个文件,让后再查找[/quote] 这样子就可以了,很奇怪,为什么会这样呢?[/quote] 可能与bs4 的版本有关系吧[/quote] 我也是用bs4呀,为什么就不行呢?[/quote] 你查一下版本,或者换个电脑试一下或者重装一下
回复
FoxFiled 2020-05-24
引用 14 楼 糊里糊涂的一锅粥 的回复:
[quote=引用 13 楼 FoxFiled的回复:][quote=引用 12 楼 糊里糊涂的一锅粥 的回复:] [quote=引用 11 楼 FoxFiled 的回复:]
text.html是我抓下来页面保存的成了文件,读取这个文件,让后再查找[/quote] 这样子就可以了,很奇怪,为什么会这样呢?[/quote] 可能与bs4 的版本有关系吧[/quote] 我也是用bs4呀,为什么就不行呢?
回复
引用 13 楼 FoxFiled的回复:
[quote=引用 12 楼 糊里糊涂的一锅粥 的回复:] [quote=引用 11 楼 FoxFiled 的回复:]
text.html是我抓下来页面保存的成了文件,读取这个文件,让后再查找[/quote] 这样子就可以了,很奇怪,为什么会这样呢?[/quote] 可能与bs4 的版本有关系吧
回复
FoxFiled 2020-05-24
引用 12 楼 糊里糊涂的一锅粥 的回复:
[quote=引用 11 楼 FoxFiled 的回复:]
text.html是我抓下来页面保存的成了文件,读取这个文件,让后再查找[/quote] 这样子就可以了,很奇怪,为什么会这样呢?
回复
引用 11 楼 FoxFiled 的回复:
text.html是我抓下来页面保存的成了文件,读取这个文件,让后再查找
回复
FoxFiled 2020-05-24
引用 10 楼 糊里糊涂的一锅粥 的回复:
引用 8 楼 FoxFiled 的回复:
你在换个方式试一下
把text.html改为对应的网址吗
回复
引用 8 楼 FoxFiled 的回复:
你在换个方式试一下
回复
FoxFiled 2020-05-24
引用 7 楼 糊里糊涂的一锅粥 的回复:
[quote=引用 6 楼 FoxFiled 的回复:]/quote]你的print(tbody) ,tbody是什么
这个:
回复
引用 4 楼 FoxFiled 的回复:
python中引号内的是字符串, 我使用td=tbody.find_all('td',class_='title_9 bg-odd')时,却返回空, 这是你原帖子上的一句换,我用手机版CSDN看的时候发现 title_9和bg-odd之间有好多空格,所以没有匹配到时空的, 下面的这个demo可以观察分析一下
from bs4 import BeautifulSoup

html = """<body>
		<tr class="top">
			<td class="title_8">1</td>
			<td class="title_9">2</td>
			<td class="title_10">3</td>
			<td class="title_11">4</td>
			<td class="title_12">5</td>
		</tr>
		<tr class="top">
			<td class="title_8 bg-odd">6</td>
			<td class="title_9 bg-odd">7</td>
			<td class="title_10 bg-odd">8</td>
			<td class="title_11 bg-odd">9</td>
			<td class="title_12 bg-odd">10</td>
			<td class="title_11 middle bg-odd">11</td>
			<td class="title_11 middle bg-odd">12</td>
			<td class="title_11 middle bg-odd">13</td>
			<td class="title_10 bg-odd">14</td>
			<td class="title_12  bg-odd">15</td>
		</tr>
	</body>
"""

soup = BeautifulSoup(html, features='lxml')

td1 = soup.find_all('td', {'class': {'title_9      bg-odd'}})
print('td1>>>',td1)
td4 = soup.find_all('td', class_='title_9   bg-odd') # 这里只有一个空格时,可以查找到
print('td4>>>',td4)
td5 = soup.find_all('td', class_={'title_9    bg-odd'}) # 可以在带# 的这行代码中添加空号试一试
print('td5>>>',td5)
td6 = soup.find_all('td', class_=['title_9 bg-odd']) # 无论是哪种,引号内的都是字符串
print('td6>>>',td6)
td7 = soup.find_all('td', class_=['title_9','bg-odd']) # 无论是哪种,引号内的都是字符串
print('td7>>>',td7)
td2 = soup.find_all('td', {'class': 'title_9'})
print('td2>>>',td2)
td3 = soup.find_all('td', {'class': 'bg-odd'})
print('td3>>>',td3)
回复
FoxFiled 2020-05-23
这个:
回复
FoxFiled 2020-05-23
引用 3 楼 糊里糊涂的一锅粥 的回复:
前端中<td class='title_9 bg-odd'> <td> ,这是两个class属性,find_all查一下这个方法的参数具体的信息,我感觉怎么写了两个是个模糊查询
那为啥class_='board-list tiz'就不是两个class属性呢?
回复
[quote=引用 6 楼 FoxFiled 的回复:]/quote]你的print(tbody) ,tbody是什么
回复
FoxFiled 2020-05-23
引用 5 楼 糊里糊涂的一锅粥 的回复:
[quote=引用 4 楼 FoxFiled 的回复:]
python中引号内的是字符串, 我使用td=tbody.find_all('td',class_='title_9 bg-odd')时,却返回空, 这是你原帖子上的一句换,我用手机版CSDN看的时候发现 title_9和bg-odd之间有好多空格,所以没有匹配到时空的, 下面的这个demo可以观察分析一下
from bs4 import BeautifulSoup

html = """<body>
		<tr class="top">
			<td class="title_8">1</td>
			<td class="title_9">2</td>
			<td class="title_10">3</td>
			<td class="title_11">4</td>
			<td class="title_12">5</td>
		</tr>
		<tr class="top">
			<td class="title_8 bg-odd">6</td>
			<td class="title_9 bg-odd">7</td>
			<td class="title_10 bg-odd">8</td>
			<td class="title_11 bg-odd">9</td>
			<td class="title_12 bg-odd">10</td>
			<td class="title_11 middle bg-odd">11</td>
			<td class="title_11 middle bg-odd">12</td>
			<td class="title_11 middle bg-odd">13</td>
			<td class="title_10 bg-odd">14</td>
			<td class="title_12  bg-odd">15</td>
		</tr>
	</body>
"""

soup = BeautifulSoup(html, features='lxml')

td1 = soup.find_all('td', {'class': {'title_9      bg-odd'}})
print('td1>>>',td1)
td4 = soup.find_all('td', class_='title_9   bg-odd') # 这里只有一个空格时,可以查找到
print('td4>>>',td4)
td5 = soup.find_all('td', class_={'title_9    bg-odd'}) # 可以在带# 的这行代码中添加空号试一试
print('td5>>>',td5)
td6 = soup.find_all('td', class_=['title_9 bg-odd']) # 无论是哪种,引号内的都是字符串
print('td6>>>',td6)
td7 = soup.find_all('td', class_=['title_9','bg-odd']) # 无论是哪种,引号内的都是字符串
print('td7>>>',td7)
td2 = soup.find_all('td', {'class': 'title_9'})
print('td2>>>',td2)
td3 = soup.find_all('td', {'class': 'bg-odd'})
print('td3>>>',td3)
[/quote] 是的,td2 = soup.find_all('td', {'class': 'title_9'})确实能够返回title_9和title_9 bg-odd这两个class的数据。有一点不太明白的是,使用print(tbody),打印出来的数据中,前端看到的class='title_9 bg-odd'都变成了class='title_9'了,这是怎么回事?
回复
前端中<td class='title_9 bg-odd'> <td> ,这是两个class他,“title_9”和“bg-odd” 后端中td=tbody.find_all('td',class_='title_9 bg-odd') 这是一个class,“title_9 bg-odd”,中间的是空格,所以没有匹配的。
回复
前端中<td class='title_9 bg-odd'> <td> ,这是两个class属性,find_all查一下这个方法的参数具体的信息,我感觉怎么写了两个是个模糊查询
回复
FoxFiled 2020-05-21
引用 1 楼 糊里糊涂的一锅粥 的回复:
前端中<td class='title_9 bg-odd'> <td> ,这是两个class他,“title_9”和“bg-odd” 后端中td=tbody.find_all('td',class_='title_9 bg-odd') 这是一个class,“title_9 bg-odd”,中间的是空格,所以没有匹配的。
“title_9”和“bg-odd”不是在一个引号里面吗?为什么是两个class呢? 同一个网页,我print(soup.find('table', class_='board-list tiz'))可以找到对应的内容啊,class内容也是有空格的。
回复
相关推荐
发帖
脚本语言
创建于2007-08-27

3.7w+

社区成员

JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
申请成为版主
帖子事件
创建了帖子
2020-05-20 10:59
社区公告

CSDN 脚本语言社区接受专栏投稿(专栏会在顶部创建专属你的栏目),投稿需满足以下要求:

  • 脚本语言技术相关;
  • 文章持续更新,保持活跃;
  • 内容清晰明了,干货为主;
  • 文章排版有序,有条有理。

本社区开通招聘专栏,发布招聘信息请联系版主,发布者需要保证招聘信息真实有效,CSDN 平台和版主不对招聘内容负责!

联系方式:私聊版主、发送邮件、QQ联系等均可: