崩溃了news.163.com(求解)
今天在测试学习的BeautifulSoup
的时候,找到了news.163.com
网易云新闻网,发现它的内容是加载在html
里的,再尝试使用bs4获取下面这部分内容的时候。
分析过程:
1.第一次怀疑自己请求到的内容不对。✖
2.第二次请求其他节点。✖
3.第三次尝试更换解析器。✖
4.第四次拷贝出element节点,存储到html文件中解析。✔
5.第五次使用xpath。✖
有谁知道这是为什么,可以评论区分享一下吗?
先看了它的html
代码结构发现它每一个文章内容都是在一个div
里的。
初始代码:
import requests
from bs4 import BeautifulSoup
url = 'https://news.163.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
print(soup.find_all('div', class_='news_title'))
第一次尝试
我以为我没有请求到正确的内容,又检查了一下请求的text
。
import requests
from bs4 import BeautifulSoup
url = 'https://news.163.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
print(response.text.find('news_title')) # 此处返回的不是-1。
soup = BeautifulSoup(response.text, 'lxml')
print(soup.find_all('div', class_='data_row news_article clearfix ')) # 空列表
第二次尝试
看了一下感觉可能是自己xpath里的语句有问题因为里面class属性带空格可能没识别到,又往下找到了一层找到了一个div class="news_title"
存储标题的。
很遗憾结果还是不正确!!!
import requests
from bs4 import BeautifulSoup
url = 'https://news.163.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
print(response.text.find('data_row'))
soup = BeautifulSoup(response.text, 'lxml')
print(soup.find_all('div', class_='news_title')) # 依然是空的
第三次尝试
bing搜索了一下,发现多数的回复都是说解析器使用错了,然后又试了lxml
和html5lib
。
依旧不行!!!
第四次尝试
拷贝出它的那段结构代码。
发现这样是可以正常请求出来的。
第五次尝试
切换到xpath,先使用了chrome浏览器的插件Xpath Helper
,可以正常获取到内容。
嵌入代码:
import requests
from lxml import etree
url = 'https://news.163.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
print(response.text.find('data_row'))
html = etree.HTML(response.text)
print(html.xpath('//div[@class="news_title"]/h3/a/text()')) # 依然是空的!!