美丽的汤 - 刮掉桌子特定元素的更好方法

时间:2017-06-20 00:25:29

标签: python web-scraping beautifulsoup

我正在通过以下网址抓取表格中公开提供的零售数据:https://502data.com/retailers

我的目标是在每个列的python中创建一个列表,例如a" Name_list"对于Web表的该列中的所有条目," County_list"等等。

这是我开始使用scrape的代码:

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,足以让我知道使用汤或all_text变量遍历此表的最佳命令,并拉出Web表每行中的数据。

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

1 个答案:

答案 0 :(得分: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元素的文本。