2017-01-10 4 views
2

Pythonの任意のウェブサイトからリンクタイトルを掻き集める一般的な方法はありますか?たとえば、次のコードを使用した場合:Pythonの任意のサイトからリンクのタイトルを削る一般的な方法は?

from urllib.request import url open 
from bs4 import BeautifulSoup 

site = "https://news.google.com" 
html = urlopen(site) 
soup = BeautifulSoup(html.read(), 'lxml'); 

titles = soup.findAll('span', attrs = { 'class' : 'titletext' }) 
for title in titles: 
    print(title.contents) 

news.google.comからほぼすべての見出しタイトルを抽出できます。しかし、www.yahoo.comで同じコードを使用すると、別のHTMLフォーマットが原因で私はできません。

これを行うより一般的な方法がありますので、ほとんどのサイトで使用できますか?

答えて

0

いいえ、それぞれのサイトは異なります。より一般的なスクレーパーを作成すると、すべての見出しタイトルほど具体的でないデータが増えます。

たとえば、次のようにすると、すべての見出しタイトルがGoogleから取得され、おそらくヤフーからも取得されます。

titles = soup.find_all('a') 
for title in titles: 
    print(title.get_text()) 

しかし、結果を濁すようなヘッダーやその他のリンクもすべて表示されます。 (ヘッドラインではないGoogleページに約150のリンクがあります)

+0

使用[ 'find_all()'](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#method-names) – wpercy

+0

@wpercyのおかげで、私は古いです。それでも動作しますが、あなたは正しいので、私はそれを変更しています。 – dstudeba

+0

ええ、私はそれがあなたよりも初心者のためであることを知っています。 – wpercy

0

CSSセレクターとXPathが必要な理由はありませんが、ページ数が少ない場合は便利な方法があります:

site = "https://news.google.com" 
if 'google' in site: 
    filters = {'name':'span', "class" : 'titletext' } 
elif 'yahoo' in site: 
    filters = {'name':'blala', "class" : 'blala' } 
titles = soup.findAll(**filters) 
for title in titles: 
    print(title.contents) 
関連する問題