2016-01-23 94 views
0

作爲背景,我在Python中搜刮網頁並使用BeautifulSoup。從hoverbox颳去信息

我需要訪問的一些信息是關於當鼠標懸停在用戶的個人資料圖片上時彈出的用戶配置文件的一個小框。問題是,這個信息是不是在HTML中可用,相反,我得到如下:

「」 DIV CLASS = 「用戶名MO」 跨度類= 「expand_inline scrname mbrName_1586A02614A388AEE215B4A3139A2C18」 的onclick =「ta.trackEventOnPage( 「評論」,「show_reviewer_info_window」,「user_name_name_click」)「>藍寶石埃德 ‘’ (我已刪除了一些> S以便HTML將在問題顯現出來,對不起!)

任何人都可以的告訴我如何做到這一點?感謝您的幫助!!

這裏是網頁,如果這是有幫助的: 查看源代碼:http://www.tripadvisor.com/Attraction_Review-g143010-d108269-Reviews-Cadillac_Mountain-Acadia_National_Park_Mount_Desert_Island_Maine.html 我試圖獲取的信息進行審查分配。

回答

1

下面是輸出字典的完整工作代碼,其中鍵是用戶名,值是評論分佈。要理解代碼是如何工作的,這裏是考慮到帳戶的關鍵事情:

  • 在覆蓋出現在鼠標懸停在與一些用戶特定參數的HTTP GET請求動態加載的信息 - 最重要的是uidsrc
  • uidsrc值可以用一個正則表達式中提取從id屬性爲每個用戶簡檔元素
  • 該GET請求的響應是HTML,你需要與BeautifulSoup解析也
  • 你應該requests.Session

保持網絡的刮會議代碼:

import re 
from pprint import pprint 

import requests 
from bs4 import BeautifulSoup 

data = {} 

# this pattern would help us to extract uid and src needed to make a GET request 
pattern = re.compile(r"UID_(\w+)-SRC_(\w+)") 

# making a web-scraping session 
with requests.Session() as session: 
    response = requests.get("http://www.tripadvisor.com/Attraction_Review-g143010-d108269-Reviews-Cadillac_Mountain-Acadia_National_Park_Mount_Desert_Island_Maine.html") 
    soup = BeautifulSoup(response.content, "lxml") 

    # iterating over usernames on the page 
    for member in soup.select("div.member_info div.memberOverlayLink"): 
     # extracting uid and src from the `id` attribute 
     match = pattern.search(member['id']) 
     if match: 
      username = member.find("div", class_="username").text.strip() 
      uid, src = match.groups() 

      # making a GET request for the overlay information 
      response = session.get("http://www.tripadvisor.com/MemberOverlay", params={ 
       "uid": uid, 
       "src": src, 
       "c": "", 
       "fus": "false", 
       "partner": "false", 
       "LsoId": "" 
      }) 

      # getting the grades dictionary 
      soup_overlay = BeautifulSoup(response.content, "lxml") 
      data[username] = {grade_type: soup_overlay.find("span", text=grade_type).find_next_sibling("span", class_="numbersText").text.strip("()") 
           for grade_type in ["Excellent", "Very good", "Average", "Poor", "Terrible"]} 


pprint(data) 

打印:

{'Anna T': {'Average': '2', 
      'Excellent': '0', 
      'Poor': '0', 
      'Terrible': '0', 
      'Very good': '2'}, 
'Arlyss T': {'Average': '0', 
       'Excellent': '6', 
       'Poor': '0', 
       'Terrible': '0', 
       'Very good': '1'}, 
'Bf B': {'Average': '1', 
      'Excellent': '22', 
      'Poor': '0', 
      'Terrible': '0', 
      'Very good': '17'}, 
'Charmingnl': {'Average': '15', 
       'Excellent': '109', 
       'Poor': '4', 
       'Terrible': '4', 
       'Very good': '45'}, 
'Jackie M': {'Average': '2', 
       'Excellent': '10', 
       'Poor': '0', 
       'Terrible': '0', 
       'Very good': '4'}, 
'Jonathan K': {'Average': '69', 
       'Excellent': '90', 
       'Poor': '6', 
       'Terrible': '0', 
       'Very good': '154'}, 
'Sapphire-Ed': {'Average': '8', 
       'Excellent': '47', 
       'Poor': '2', 
       'Terrible': '0', 
       'Very good': '49'}, 
'TundraJayco': {'Average': '14', 
       'Excellent': '59', 
       'Poor': '0', 
       'Terrible': '1', 
       'Very good': '49'}, 
'Versrii': {'Average': '2', 
      'Excellent': '8', 
      'Poor': '0', 
      'Terrible': '0', 
      'Very good': '10'}, 
'tripavisor83': {'Average': '12', 
        'Excellent': '9', 
        'Poor': '1', 
        'Terrible': '0', 
        'Very good': '20'}} 
+0

你是一個聖人! ;-) 祝你們好運。 – shellter

+0

這太棒了!感謝您的幫助! – Amie