马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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> 标签并打印出来。
|