在练习用python爬取网站内容时,遇到标签里有《br》时运行后返回值为None,这种情况应该如何解决?尝试了一下在使用Beautifulsoup爬取内容前用Replace将《br》替换掉,但是没有用,返回值还是None,然后还尝试了在爬取之后将内容转换为字符串,这样是可以跑出结果,但是《p》《/p》之类的值全部变成字符串了,很难切片,有没有厉害的程序员指导一下这是咋回事呀?应该怎么解决TAT
import requests
from bs4 import BeautifulSoup
import re
import xlwt
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188"
}
def main():
keyword = "可再生能源"
datalist = searchlaw(keyword)
for start_num in range(1,3,1):
def searchlaw(keyword):
response = requests.get(f"http://law1.law-star.com/search?kw={keyword}&dbt=chl&dbt=lar&ps=50&sort=imp&p={start_num}",headers=headers)
html = response.text.replace('<br/>','')
soup = BeautifulSoup(html,"html.parser")
datalist=[]
all_times = soup.findAll("p")
for time in all_times:
#when =((str(time).replace("<br/>","")).replace("<br>","")).replace(" ","")
print(time.string)
datalist.append(time)
return datalist
main()
这是要爬的数据
这是输出的结果
问题1: 返回值为None
在BeautifulSoup中,如果解析的内容中包含了一些标签不完整、格式不正确或不被支持的标签,可能会导致解析时出现问题,返回None。针对这个问题,你可以考虑使用更加宽松的解析方式,例如指定解析器为'lxml',这个解析器在处理不完整标签时更加容忍。
问题2: 对内容切片困难
由于解析后的内容是以标签对象(Tag对象)的形式存在,直接使用字符串的切片方法可能会导致意想不到的结果。可以使用BeautifulSoup提供的方法和属性
以下是修改后的代码
```python
import requests
from bs4 import BeautifulSoup
import xlwt
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188"
}
def main():
keyword = "可再生能源"
datalist = []
for start_num in range(1, 3): # 注意这里的范围,range函数不包括结束值
data = searchlaw(keyword, start_num)
datalist.extend(data)
for item in datalist:
print(item)
def searchlaw(keyword, start_num):
response = requests.get(f"http://law1.law-star.com/search?kw={keyword}&dbt=chl&dbt=lar&ps=50&sort=imp&p={start_num}", headers=headers)
html = response.text
soup = BeautifulSoup(html, "lxml") # 使用lxml解析器
datalist = []
all_times = soup.find_all("p")
for time in all_times:
# 对每个<p>标签中的内容进行处理,可以直接使用.text属性来获取纯文本内容
datalist.append(time.text)
return datalist
if __name__ == "__main__":
main()
```
你这个打印出来的是time对象吧,你试试先用time.get_text()方法来获取text的内容。这样试一下:
# 用time.get_text()方法来获取text的内容
text = time.get_text(strip=True)
print(text)
datalist.append(text)
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
改用 time.text
而不是 time.string
问题点: 第20行代码错误
代码修改为
# print(time.string)
print(time.text)
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!【以下回答由 GPT 生成】
问题描述中提到,在使用BeautifulSoup爬取内容之前尝试使用replace函数将
标签替换掉,但是没有成功,返回值仍然是None。这是因为BeautifulSoup无法解析
标签。解决这个问题的方法是在爬取内容之前,将
标签替换为其他符号,然后在解析完内容之后再将其替换回来。
以下是优化后的代码示例:
import requests
from bs4 import BeautifulSoup
import re
import xlwt
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188"
}
def main():
keyword = "可再生能源"
datalist = search_law(keyword)
def search_law(keyword):
response = requests.get(f"http://law1.law-star.com/search?kw={keyword}&dbt=chl&dbt=lar&ps=50&sort=imp&p={start_num}", headers=headers)
html = response.text.replace("<br>", "@@BR@@").replace("<br/>", "@@BR@@") # 将<br>标签替换为其他符号
soup = BeautifulSoup(html, "html.parser")
datalist = []
all_times = soup.findAll("p")
for time in all_times:
content = str(time).replace("@@BR@@", "<br>") # 将替换的符号还原回<br>标签
print(content)
datalist.append(content)
return datalist
main()
这里将
标签替换为了@@BR@@符号,然后在解析完内容之后再将@@BR@@替换回
标签。这样就解决了在爬取内容时,
标签导致返回值为None的问题。
希望能帮助到您!如果还有其他问题,请随时提问。