|  | 
 
| 
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  复制代码from bs4 import BeautifulSoup
import requests
import re
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari'
}
url = "https://www.17bxwx.com/dir/804/804839.htm"
response = requests.get(url=url, headers=headers)
bs = BeautifulSoup(response.text, "lxml")
w = bs.find("div", {"id": "list"}).find("dl")
t = re.match("<a.*?/a>", str(w))
print(t)
正则匹配后的结果尽然是空!
 这是怎么回事?
 
这个问题的根源在于你正则表达式的使用方式。你尝试使用的正则表达式  <a.*?/a>  是尝试匹配一个以  <a  开头,以  /a>  结束的字符串。但是在使用  re.match  函数的时候,这个函数会从字符串的开始位置尝试匹配这个正则表达式。如果你的字符串开始的部分并不符合这个正则表达式,那么  re.match  就会返回  None 。
 根据你的代码,你是想从 BeautifulSoup 解析出来的结果中找到所有的  <a>  标签。在这个情况下,其实没有必要使用正则表达式。你可以直接使用 BeautifulSoup 的  find_all  函数来寻找所有的  <a>  标签。以下是一个修改过的代码示例:
 
 
 复制代码from bs4 import BeautifulSoup
import requests
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari'
}
url = "https://www.17bxwx.com/dir/804/804839.htm"
response = requests.get(url=url, headers=headers)
bs = BeautifulSoup(response.text, "lxml")
w = bs.find("div", {"id": "list"}).find("dl")
t = w.find_all('a')
for link in t:
    print(link)
 这段代码会找到所有的  <a>  标签并打印出来。如果你依然想使用正则表达式来进行匹配,那么你应该使用  re.findall  函数,而不是  re.match 。这是因为  re.findall  函数会找到字符串中所有符合正则表达式的部分,而不仅仅是从开始位置进行匹配。
 
 如果你想使用正则表达式,那么代码可以修改为:
 
 
 复制代码import re
from bs4 import BeautifulSoup
import requests
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari'
}
url = "https://www.17bxwx.com/dir/804/804839.htm"
response = requests.get(url=url, headers=headers)
bs = BeautifulSoup(response.text, "lxml")
w = bs.find("div", {"id": "list"}).find("dl")
t = re.findall("<a.*?/a>", str(w))
for link in t:
    print(link)
 这段代码会找到字符串中所有的  <a>  标签并打印出来。
 | 
 |