使用 Python BeautifulSoup 进行网页抓取

Web scraping using Python BeautifulSoup

from urllib.request import urlopen as uReq 
from bs4 import BeautifulSoup as soup
my_url="http://www.mouthshut.com/mobile-operators/Reliance-Jio-reviews-925812061"

uClient=uReq(my_url)

page_html=uClient.read()

page_soup=soup(page_html,"html.parser")

containers=page_soup.findAll("div",{"class":"row review-article"})
print(len(containers))
print(containers[0].a)

我想得到 link 配置文件(给定图片中的 Chitanverma)作为我的输出,但我得到 Reliance Jio 服务的 link 作为我的输出。

如果有人帮助我更正我的代码以获得预期的输出,并解释为什么我得到 Reliance Jio 服务的 link 作为我的输出,我将不胜感激。

我的目的是从网页 http://www.mouthshut.com/mobile-operators/Reliance-Jio-reviews-925812061 中抓取个人资料的名称。

具有用户数据的 div 的正确选择器是:

containers = page_soup.findAll("div", {"class": "profile"})
first_container = containers[0]

但是 DOM 的这个片段是通过调用 javascript 方法 getuserprofile 呈现的,所以你不能使用 beatifulsoup 检索它,因为它 returns:

<div class="col-2 profile" id="ctl00_ctl00_ContentPlaceHolderFooter_ContentPlaceHolderBody_rptreviews_ctl00_divProfile"><script> 

getuserprofile(1318536,8393808,0,1,0,'','ctl00_ctl00_ContentPlaceHolderFooter_ContentPlaceHolderBody_rptreviews_ctl00_divProfile',3,'ctl00_ctl00_ContentPlaceHolderFooter_ContentPlaceHolderBody_rptreviews_ctl00_spnview','ctl00_ctl00_ContentPlaceHolderFooter_ContentPlaceHolderBody_rptreviews_ctl00_smdatetime')
</script></div>

在这种情况下,您必须依靠任何浏览器模拟器来抓取动态生成的内容。 Selenium 可以作为一种选择。如果您已经在您的机器上安装了 selenium,请尝试以下示例。

from bs4 import BeautifulSoup
from selenium  import webdriver

driver = webdriver.Chrome()
driver.get('http://www.mouthshut.com/mobile-operators/Reliance-Jio-reviews-925812061')
soup = BeautifulSoup(driver.page_source,"lxml")
for link in soup.select(".profile"):
    try:
        profile = link.select("p:nth-of-type(1) a")[0]
    except:pass      
    print(profile.text, profile['href'])

driver.quit()

部分输出:

chintanverma http://www.mouthshut.com/chintanverma
ganeshgauttam http://www.mouthshut.com/ganeshgauttam
viratvenkat1 http://www.mouthshut.com/viratvenkat1
ms37872 http://www.mouthshut.com/ms37872
bibekdas http://www.mouthshut.com/bibekdas