使用Beautifulsoup find_all时如何跳过一行?

How to skip a line when using Beautifulsoup find_all?

提问人:Alberi 提问时间:7/5/2023 更新时间:7/5/2023 访问量:39

问:

这是我的代码。它查找所有没有“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) 
python beautifulsoup findall 跳过

评论

0赞 Codist 7/5/2023
为什么要增加page_number

答:

-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()