2017-09-21 32 views
3

ちょうどWebでぼかしを開始したPythonで、私はいくつかの問題に直面しています。BeautifulSoupとlxmlがdiv要素を見つけることができません

私は、Webページのソースをダウンロードするにはセレンを使用して開始し、それを保存:

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") 

に問題が来る:私はそれのidで特定のdivを探してみた場合、それは私に何を返します:

from bs4 import BeautifulSoup as BS 
soup= BS(browser.response().read(),'lxml') 
print(soup.find(id="div_id")) 

機械的に得られたソースコードを通常のテキストエディタで調べると、それを見つけることができます。それはのようなものです:

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

このdiv要素は、他の多くの子要素を持っている、それはコード、および完全なソースコード「に」1/5程度に位置しています、私が代わりに近く、他のDIVを探してみてください500kb.Ifについてです、運もない。ソースコードの冒頭付近にあるdivを探すと、それが見つかります。興味深いのは、取得したソースコードではなく、Seleniumで取得したソースコードで同じ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と同じように、セレンで得られたソースコード内のdiv要素を見つけることができたが、ありません機械化で。だから私はそれは、Mechanizeのとは何かを持っていると考えていたとの要求に使用する有効:BSまたはlxmlのいずれかで、divのため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は私が分析するかどうか起こりません直接応答をするか、ファイルに保存してファイルを分析するかどうかを指定します。

私はそれについて考えています...私はまた、私はセレンとそれをやったことがわかりましたが、機械化と要求の応答をエンコードしようとしましたが、変更はありません。私はまた、他のBSバージョン(3.x)を使用してみました。変更はありません。

要約: - BSまたはlxmlのdivをSeleniumで取得したソースコードに検索すると、それが見つかります。他の項目はありません。 - 私がソースコードの始めに他のdivを探すと、BSとlxmlはコードを取得するために使用された方法とは関係なくそれを見つけます。 - 検査の際、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は、おそらくJavascriptで処理されるHTMLコメントの中に隠されています。あなたはまだ、次のように最初の隠されたHTMLを抽出するためにrequestsを使用することができます。

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にコメントをすべて検索し、いずれかがあなたのidが含まれているならば、決定するためにBeautifulSoupを取得します。一致するものが見つかった場合は、コメント自体がBeautifulSoupに再度渡され、後で処理されます。これにより、お客様の<div>は次のように表示されます。

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

それです! soup.find_all(文字列=ラムダテキスト:isinstance(テキスト、コメント))のコメントのために "どのようにコメントしますか?私はあまりよく分からない。そして、あなたはBSがこの仕事に最も適していると思いますか、あるいは他のツールが私にはうってつけでしょうか?ありがとうございました! – Bleracas

+0

'comments'は単なる特殊なタイプのテキストです。これは、ドキュメント内のすべてのコメントを返すためのトリックです。他のツールがありますが、私はBSを使う傾向があります。 –

関連する問題