我想从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"
下给出,但在解析时没有这样的细分。
答案 0 :(得分:1)
通过ajax请求加载页面后,便会填充要剪贴的数据。通过python Requests库发出请求时,只会显示html页面。
您有2个选择。
使用selenium(或其他requests-html之类的选项)呈现javascript加载的内容。
直接发出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
答案 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?的解决方案非常相似