爬虫遇到<br>返回none该怎么处理

在练习用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()

这是要爬的数据

img

这是输出的结果

img

问题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)
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【以下回答由 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的问题。

希望能帮助到您!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^