提问人:Alberi 提问时间:7/5/2023 更新时间:7/5/2023 访问量:39
使用Beautifulsoup find_all时如何跳过一行?
How to skip a line when using Beautifulsoup find_all?
问:
这是我的代码。它查找所有没有“https://”和域名的汽车链接。但是,其中一个是与“https://...”的完整链接。 如何编写一个代码,跳过这个结果,告诉他不介意带有“https://”或任何其他文本的行?
for page_number in range(1, 10):
url = f"xyz{page_number}"
page_number += 1
req = requests.get(url)
src = req.text
soup = BeautifulSoup(src, "lxml")
get_car_links = soup.find_all(class_="info-container")
for i in get_car_links:
car_links = i.find("a", class_="title")
car_datas = (car_links.get("href"))
print(car_datas)
答:
-1赞
Zero
7/5/2023
#1
您可以添加条件来检查和跳过案例。if
from bs4 import BeautifulSoup
import requests
for page_number in range(1, 10):
url = f"xyz{page_number}"
page_number += 1
req = requests.get(url)
soup = BeautifulSoup(req.text, "lxml")
get_car_links = soup.find_all(class_="info-container")
for i in get_car_links:
if not 'http' in i.find('a', class_='title').get('href'):
car_links = i.find("a", class_="title")
car_datas = car_links.get("href")
print(car_datas)
评论
1赞
Codist
7/5/2023
您可以使用 str.startswith() 而不是 in 来避免可能的歧义。更好的是,使用 urllib.parse.urlsplit() 或 urllib.parse.urlparse() 来确定 URL 是否有方案
0赞
Alberi
7/5/2023
编辑后的版本有效。谢谢
0赞
Zero
7/5/2023
对不起@Alberi,我错过了先找到标签。我已经更新了代码。a
0赞
Zero
7/5/2023
@DarkKnight,使用将是最好的方法。urllib
0赞
Alberi
7/5/2023
@Zero 在您编辑答案后,它现在正在工作。谢谢。
0赞
Codist
7/5/2023
#2
你要做的是消除(忽略)具有方案的 HREF - 例如,https、http、ftp、mailto
因此,使用 URL 解析器而不是搜索常量字符串似乎是明智的。
像这样的东西:
from urllib.parse import urlparse
import requests
from bs4 import BeautifulSoup as BS
URL = 'https://example.com/bar'
def main():
for page in range(1, 10):
with requests.get(f'{URL}{page}') as response:
response.raise_for_status()
soup = BS(response.text, 'lxml')
for car_link in soup.find_all(class_='info-container'):
if (a := car_link.find('a', class_='title')):
if not urlparse(href := a['href']).scheme:
print(href)
if __name__ == '__main__':
main()
评论