【问题标题】:A Beautiful Soup script with two variables in the URLURL 中有两个变量的 Beautiful Soup 脚本
【发布时间】:2020-04-30 02:10:33
【问题描述】:

我正在尝试抓取此网站。我需要一个脚本,它可以将名称放在 URL 的“who=”部分,还可以将要抓取的页面编号放在“page=”中。

这是当前脚本:

import requests
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
from colorama import Fore, Style

def main(url):
    names = ["Bryan", "David", "Robert"]
    with requests.Session() as req:
        data = []
    for name in names:
        for page in range(1, 9):
            print(url.format(Fore.RED + name + Style.RESET_ALL, Fore.YELLOW + str(page) + Style.RESET_ALL))
            print(f"Extracting Page# {page}")

            r = req.get(url.format(page))
            soup = bs(r.content, 'html.parser')

            names = [name.text for name in soup.select("h2.name.title.inbl")]
            address = [address.text for address in soup.select("div.h4.address.mtreset")]
            phone = [ph.group(1) for ph in re.finditer(r'mainLine":"(\d+)', r.text)]
            for x, y, z in zip(names, address, phone):
                if z.startswith(("06", "07")):
                    data.append([x, y, z])
                    print(z)

        df = pd.DataFrame(data, columns=["Name", "Address", "Phone"])
        print(df)
        df.to_csv(r'C:////////.csv', index=False)
        print("Data Saved to your csv")

main("https://www.#########.com/search?part=1&who={}&page={}")

请有人解释一下问题出在哪里并最终纠正这个脚本?

非常感谢您

【问题讨论】:

  • 我相信你之前的question已经解决了这个问题
  • 你好@αԋɱҽԃαмєяιcαη 谢谢你的留言。不完全是,我在这个新问题中要求它,因为我的脚本无法正常工作

标签: python variables web-scraping beautifulsoup


【解决方案1】:

您的错误是您在 print 语句中分配值而不是实际的 url 变量

print(url.format(Fore.RED + name + Style.RESET_ALL, Fore.YELLOW + str(page) + Style.RESET_ALL))

在这里你只分配一个值后使用 url

r = req.get(url.format(page))

这里有两种不同的方法:

方法 1

import requests
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
from colorama import Fore, Style

def main(url):
    names = ["Bryan", "David", "Robert"]
    with requests.Session() as req:
        data = []
        for name in names:
            for page in range(1, 9):
                url = url.format(Fore.RED + name + Style.RESET_ALL, Fore.YELLOW + str(page) + Style.RESET_ALL)
                print(url)
                print(f"Extracting Page# {page}")

                r = req.get(url)
                soup = bs(r.content, 'html.parser')

                names = [name.text for name in soup.select("h2.name.title.inbl")]
                address = [address.text for address in soup.select("div.h4.address.mtreset")]
                phone = [ph.group(1) for ph in re.finditer(r'mainLine":"(\d+)', r.text)]
                for x, y, z in zip(names, address, phone):
                    if z.startswith(("06", "07")):
                        data.append([x, y, z])
                        print(z)

            df = pd.DataFrame(data, columns=["Name", "Address", "Phone"])
            print(df)
            df.to_csv(r'C:////////.csv', index=False)
            print("Data Saved to your csv")

main("https://www.#########.com/search?part=1&who={}&page={}")

方法 2

import requests
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
from colorama import Fore, Style

def main(url):
    names = ["Bryan", "David", "Robert"]
    with requests.Session() as req:
        data = []
        for name in names:
            for page in range(1, 9):

                url_parm = {
                            'part'  : 1
                            ,'who'   : Fore.RED + name + Style.RESET_ALL
                            ,'page' : Fore.YELLOW + str(page) + Style.RESET_ALL
                            }

                print(f"Extracting Page# {page}")

                r = req.get(url , params = url_parm)
                soup = bs(r.content, 'html.parser')

                names = [name.text for name in soup.select("h2.name.title.inbl")]
                address = [address.text for address in soup.select("div.h4.address.mtreset")]
                phone = [ph.group(1) for ph in re.finditer(r'mainLine":"(\d+)', r.text)]
                for x, y, z in zip(names, address, phone):
                    if z.startswith(("06", "07")):
                        data.append([x, y, z])
                        print(z)

            df = pd.DataFrame(data, columns=["Name", "Address", "Phone"])
            print(df)
            df.to_csv(r'C:////////.csv', index=False)
            print("Data Saved to your csv")

main("https://www.#########.com/search") 

【讨论】:

  • 您好@ahmedsoliman,非常感谢您的回答。另一个问题:第一种方法仅适用于第一页。它确实 "page=1" , "page=1" , "page=1" ... 而第二种方法并没有刮什么我不知道为什么:/
  • @ChristianHEREDIA 这两种方法都有效,但如果没有网站网址,我无法判断出什么问题
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 2021-08-13
  • 2017-03-30
  • 2019-07-21
  • 2018-04-26
  • 1970-01-01
  • 2021-02-28
  • 2018-10-19
相关资源
最近更新 更多