2017-09-21 9 views
3

방금 ​​웹을 시작한 파이썬으로 시작했는데 몇 가지 문제가 있습니다. BeautifulSoup 및 lxml에서 div 요소를 찾을 수 없습니다.

나는 웹 페이지의 소스를 다운로드 셀레늄을 사용하고 절약 시작 :

from selenium import webdriver 
driver= webdriver.Firefox() 
driver.get("https://www.website.com") 
f=open('output.txt','w') 
f.write(driver.page_source.encode('utf-8')) 
f.close() 
driver.quit() 

모든 것이 잘 작동하지만, 셀레늄 너무 많은 시간이 걸립니다, 그래서 첫 페이지 소스를 얻기 위해, 기계화 설정 :

여기
import mechanize 
browser = mechanize.Browser() 
browser.set_handle_robots(False) 
cookies = mechanize.CookieJar() 
browser.set_cookiejar(cookies) 
browser.addheaders = [('User-agent', 'Mozilla/5.0')] 
browser.set_handle_refresh(False) 
browser.open("https://www.website.com") 

문제를 온다 :

from bs4 import BeautifulSoup as BS 
soup= BS(browser.response().read(),'lxml') 
print(soup.find(id="div_id")) 
,691 : 나는 그것의 ID로 특정 사업부를 찾는 시도하는 경우, 그것은 나에게 아무것도 반환하지 않습니다

기계어로 얻은 소스 코드를 일반 텍스트 편집기로 검사하면 찾을 수 있습니다. 그것은 뭔가처럼 :

<div id="div_id" data referrer="div_id"> 

이 사업부는 다른 많은 자식 요소, 그것은 약 1/5 코드 "로"위치 해 있으며, 전체 소스 코드는 내가 대신 다른 사업부 근처를 찾는 시도 500kb.If에 관한 것입니다, 행운도. 반면에 소스 코드의 시작 부분에있는 div를 찾으면 발견 할 수 있습니다. 그리고 재미있는 점은, 셀 늄으로 얻은 소스 코드에서 얻은 소스 코드 대신 동일한 div (BS 포함)를 찾는다면 더욱 흥미로운 사실입니다. Mechanize를 사용하면 div를 텍스트 편집기로 검사하여 완전히 같아 보이지만 찾을 수 있습니다.

전 BS 지원 파서를 사용해 보았습니다. 운이 없었습니다. 그래서 나는 그것이 어쩌면 BS 함께 할 수있는 뭔가가 있다고 생각하고, 나는 LXML와 동일한 작업을 수행하려고 :

from lxml import etree 
parser= etree.HTMLParser() 
tree= etree.parse(open('source.txt'),parser) 
results= tree.xpath('//div[@id="div_id"]') 
print(etree.tostring(results[0])) 

BS와 마찬가지로, 셀레늄을 얻을 소스 코드에서 사업부를 찾을 수 있었다, 그러나 기계화와. 그래서 나는 그것이, 기계화와 함께 할 수있는 뭔가가 있다고 생각하고 요청 사용 설정 : BS 또는 LXML 중 하나와 함께, 사업부에 대한 page.content에보고

import requests 
from fake_useragent import UserAgent 
ua=UserAgent() 
url= 'https://www.website.com' 
headers= {'User-agent': str(ua.chrome)} 
page = requests.get(url, headers=headers) 

을 다시 더 luck.It 내가 분석 여부를 발생하지 직접 응답을 보내거나 파일에 저장 한 다음 파일을 분석하는지 여부를 결정합니다.

그리고 나는 그것에 대해 생각합니다 ... 나는 Mechanize와 Requests 응답을 인코딩하려고 시도했습니다. 셀레늄으로 처리했으나 변경되지 않았습니다. 나도 다른 BS 버전 (3.x)을 사용했다. 변경하지 않았다.

요약하면 다음과 같습니다. - BS 나 lxml로 div를 Selenium을 통해 얻은 소스 코드로 찾으면 발견합니다. 다른 것들은 없습니다. - 소스 코드의 시작 부분에서 다른 div를 찾으면 BS 및 lxml이 코드를 가져 오는 데 사용 된 방법과 관계없이 해당 div를 찾습니다. - 검사 할 때 모든 경우에 div가 있습니다. 사용

버전 : -python : 2.7.9 -BeautifulSoup : 4.6.0 -Mechanize : 0.3.5 -Requests : 2.18.4 -Selenium : 3.5.0 -lxml : 4.0.0 -OS : linux debian

고맙습니다.

+0

실제 URL을 알려 주시면 도움이됩니다. –

+0

url : https://www.facebook.com/groups/1584160618524185/ div id : pagelet_forsale_island 감사합니다. – Bleracas

답변

0

찾고있는 div는 자바 스크립트를 통해 처리되는 HTML 주석 안에 숨겨져 있습니다.

from bs4 import BeautifulSoup, Comment 
import requests 

id = "pagelet_forsale_island" 

r = requests.get("https://www.facebook.com/groups/1584160618524185/") 
soup = BeautifulSoup(r.content, "html.parser") 

for comment in soup.find_all(string=lambda text:isinstance(text, Comment)): 
    if id in comment: 
     hidden_soup = BeautifulSoup(comment, "html.parser") 

     for div in hidden_soup.find_all('div', id=id): 
      print div 

이것은 HTML에서 주석을 모두 찾을 BeautifulSoup로를 얻고있는이 id이 포함 된 경우 다음 결정 : 당신은 여전히 ​​다음과 같이 먼저 숨겨진 HTML을 추출 requests를 사용할 수 있습니다. 일치하는 것이 발견되면 주석 처리 자체가 BeautifulSoup에 다시 전달되어 처리됩니다. 그러면 <div>이 다음과 같이 표시됩니다.

<div data-referrer="pagelet_forsale_island" id="pagelet_forsale_island"></div> 
+0

그게 전부입니다! soup.find_all (string = lambda text : isinstance (text, Comment))의 주석에 대해 "어떻게 작동합니까? 나는 잘 모르겠다. 그리고 BS가이 작업에 가장 적절하다고 생각합니까 아니면 다른 도구가 나에게 더 잘 어울릴 것 같습니까? 고맙습니다! – Bleracas

+0

'comments'는 단지 특별한 텍스트 유형입니다. 이는 문서에서 발견 된 모든 주석을 반환하는 트릭입니다. 다른 도구가 있는데, 나는 BS를 사용하는 경향이있다. –