在非英语字符站点中刮取数据的问题[Python]

时间:2019-01-06 20:51:52

标签: python selenium web-scraping beautifulsoup

我正在尝试抓取主题标签中的帖子数量,它可以与以下代码完美配合:

from selenium import webdriver
import bs4 as bs
import pandas as pd
import datetime

driver = webdriver.Chrome()
driver.get('https://www.instagram.com/explore/tags/hkig')
source = driver.execute_script("return document.body.innerHTML")
soup = bs.BeautifulSoup(source,'lxml')

post = soup.find('span', class_='g47SY ').text
print(post)

但是,如果我将标签更改为非英语字符,则会崩溃,原因是什么以及如何解决?

以下脚本将给出错误:

from selenium import webdriver
import bs4 as bs
import pandas as pd
import datetime    

driver = webdriver.Chrome()
driver.get('https://www.instagram.com/explore/tags/モデル')
source = driver.execute_script("return document.body.innerHTML")
soup = bs.BeautifulSoup(source,'lxml')

post = soup.find('span', class_='g47SY ').text
print(post)

已编辑:

我得到的错误如下:追溯(最近一次呼叫过去):

  

文件“ C:/用户/用户/桌面/temp.py”,第12行,在       post = soup.find('span',class _ ='g47SY').text AttributeError:'NoneType'对象没有属性'text'

beautifulsoup似乎无法在'span', class_='g47SY '中找到任何内容,因此发出了这样的错误,因此回到我的问题,为什么它找不到它?我检查了帖子元素的数量,表明它仍然为<span class="g47SY ">6,262,389</span>,也许与utf-8 ascii编码问题有关?

2 个答案:

答案 0 :(得分:2)

您需要等待使用WebDriverWait直到找到类名称为g47SY的元素为止,如果使用Selenium,最好不要使用BeautifulSoup。

driver.get('https://www.instagram.com/explore/tags/モデル')
post = WebDriverWait(driver, 10).until(
    lambda driver: driver.find_element_by_class_name('g47SY')
)
print(post.text)

答案 1 :(得分:1)

每当使用硒来抓取数据时,在大多数情况下都考虑添加sleep,这将花费一些时间来加载页面,因此页面的整个源代码都无法被捕获。供参考,请看下面的可行代码

from selenium import webdriver
import bs4 as bs
import pandas as pd
import datetime
import time        #note this line

driver = webdriver.Chrome()
driver.get('https://www.instagram.com/explore/tags/モデル')
time.sleep(8)                                          #note this as well moreover it should be after get method 
source = driver.execute_script("return document.body.innerHTML")
soup = bs.BeautifulSoup(source,'lxml')
print(soup)

post = soup.find('span', class_='g47SY ').text
print(post)