我该如何刮除BeautifulSoup无法获取的一些div部分?

时间:2019-01-22 17:03:10

标签: python html web-scraping beautifulsoup webpage

我想从this抓取公司信息。

与数据相关的Div部分是div class="col-xs-12 col-md-6 col-lg-6,但是运行以下代码提取所有类时,该类不可用

import requests
from bs4 import BeautifulSoup

page = requests.get("http://gyeonquartz.com/distributors-detailers/")
soup = BeautifulSoup(page.content, 'html.parser')

print(soup.prettify())

当我们检查网络资源时,所有经销商的详细信息都在div class="col-xs-12 col-md-6 col-lg-6"下给出,但在解析时没有这样的细分。

2 个答案:

答案 0 :(得分:1)

通过ajax请求加载页面后,便会填充要剪贴的数据。通过python Requests库发出请求时,只会显示html页面。

您有2个选择。

  1. 使用selenium(或其他requests-html之类的选项)呈现javascript加载的内容。

  2. 直接发出ajax请求并获取json响应。您可以使用浏览器中检查工具上的“网络”标签找到此内容。

在这种情况下,第二个选项如下。

import requests
from bs4 import BeautifulSoup
import pandas as pd
page = requests.get("http://gyeonquartz.com/wp-admin/admin-ajax.php?action=gyeon_load_partners")
print(page.json())

这将输出一个很长的json。我已经将其转换为DataFrame以便更好地查看。

import requests
from bs4 import BeautifulSoup
import pandas as pd
page = requests.get("http://gyeonquartz.com/wp-admin/admin-ajax.php?action=gyeon_load_partners")
df=pd.DataFrame.from_dict(page.json())
df['address'] = [BeautifulSoup(text,'html.parser').get_text().replace("\r\n","") for text in df['address'] ]
print(df) #just use df if in jupyter notebook

我的jupyter笔记本的示例输出如下。 enter image description here

答案 1 :(得分:0)

如果您查看页面源代码,则会发现您要查找的div标签都不存在于页面源代码中。因为请求仅发出初始请求,并且不会加载javascript完成的任何动态内容,所以您要查找的标记不包含在返回的html中。

要获取动态内容,您需要mimic whatever requests the page is making (like with a curl request)load the page within a headless browser(like selenium).,问题不在于解析器,而在于内容。

How to use requests or other module to get data from a page where the url doesn't change?的解决方案非常相似