【问题标题】:Beautiful Soup - better way to scrape specific elements of a tableBeautiful Soup - 刮取表格特定元素的更好方法
【发布时间】:2017-11-22 08:05:14
【问题描述】:

我正在从这个 URL 的表格中抓取一些公开的零售数据:https://502data.com/retailers

我的目标是在 python 中为每一列创建一个列表,例如一个“Name_list”,其中包含 Web 表的该列中的所有条目,一个“County_list”等等。

这是我开始使用抓取的代码:

r = requests.get(url_to_scrape)
soup = BeautifulSoup(r.text, 'html.parser')
all_text = soup.get_text()

在我看来,我的 all_text 变量可能不是必需的。看起来必须有一种比我目前意识到的更巧妙的方法来做到这一点。例如:

all_text[7200:8000]

以上产出:

u', function($scope, $filter) {\n                    $scope.retailers = [{"licensenumber":"414876","name":"MAIN STREET MARIJUANA","city":"VANCOUVER","county":"CLARK","year":2017,"month":5,"sales":41170232.357500,"tax":14971101.020000,"recentSales":1374866.000000,"recentTax":508700.000000,"monthName":"May"}, ...

我可以看到,在 $scope.retailers = 之后,我以一种易于解析的方式存储了我想要存储的所有信息。

我只是对 Beautiful Soup 不够熟悉,无法知道循环该表的最佳命令,使用 soup 或 all_text 变量,并提取 Web 表的每一行中的数据。

寻找针对此问题的特定解决方案以及针对初学者的任何一般 BeautifulSoup 建议。

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    由于这实际上不是您要解析的 HTML,而是 JavaScript 代码,所以我要么使用 JavaScript 解析器,如 slimit,要么使用 正则表达式

    import json
    import re
    
    import requests
    
    
    url = "https://502data.com/retailers"
    response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'})
    
    pattern = re.compile(r"\$scope\.retailers = (\[.*?\]);")
    
    match = pattern.search(response.text)
    data = json.loads(match.group(1))
    for item in data:
        print(item["name"])
    

    这里的括号表示"capturing group",反斜杠用于转义字符。

    请注意,我将表达式直接应用于页面源,根本没有使用BeautifulSoup。我们可以使用它来定位这个script 元素,然后将表达式应用于script 元素的文本。

    【讨论】:

    • 太好了,谢谢!你能解释一下响应变量中“headers”指定的内容吗?
    • @pavlov 在这种情况下实际上没有必要指定自定义用户代理标头,只是我的不良网络抓取习惯:)
    • 好的,那是什么?您正在指定用于抓取的计算机和浏览器?
    • @pavlov 基本上是为了伪装成一个真正的浏览器。
    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 2020-07-04
    • 2021-03-11
    • 2018-04-22
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多