2017-12-20 10 views
0

私はPython3.6でBeautifulSoup4を使用して、生成されたページをウェブで擦っています。情報は常に同じように配置されていますが、情報自体は変わります。これは私が掻き集めているものです。BS4とPython 3.6 Web Scrapingを使用して、特定の<font>文字列の正確に4番目のインスタンスの後ろにあるテキストを見つける方法は?

輸入:BeautifulSoup4、LXML、Tkinterのは、SYS、OS、時間

私はそれは常に非常に最初のタグなので簡単です情報の最初のビットを取得するための基本的なsoup.findを使用してきました。であることを削れ

<font face="Arial" size="-1"> 

information = soup.find('font', {'face': 'Arial', 'size': '-1'}).b.div.previousSibling 

はいつも、私は[重要な情報]である、探しているものを引っ張ります。これはすべて<body>にあり、最初のビットは首尾よく削り取られます。

私がいる問題は、私はちょうど

<td align="right"><font face="Arial" size="-1" color="BLACK">INFORMATION I NEED</font></td> 

しかし、いくつかのインスタンスとして同じラインの内側にあるタグ

<font face="Arial" size="-1" color="BLACK">informationIneed</font> 

の第四インスタンスの後だ情報を必要とされる

情報が変更されます。

私は情報の最初のビットを引っ張るsoup.findを交換し、

information = soup.find('font', {'face': 'Arial', 'size': '-1', 'color': 'BLACK'}).b.div.previousSibling 

にそれを回すとき、私は「はAttributeErrorを得る: 『NoneType』オブジェクトが属性 『previousSiblingは』を持っていない私はこれを前提としているので、私が参照している情報には<div>または<b>というタグはありませんが、私が使用しているコードは自分で生成されていません。正しく調整する方法はまだわかりません。を.td.previousSiblingに置き換えても機能しません。私は何を試してみるべきか分からない。

TL; DR、do誰でも<font face="Arial" size="-1" color="BLACK">の4番目のインスタンスの後、または<td align="right"><font face="Arial" size="-1" color="BLACK">の2番目のインスタンスの直後に直接情報を取得する方法を知っていますか?

編集1:より簡単な方法は、次の整数を見つけることです。これは3桁まで増やすことができます。

<td align="right"><font face="Arial" size="-1" color="BLACK">&nbsp;1</font>のように見えます。ここでは、</font>の直前の1を削りたいと思っています。 <td align="right"><font face="Arial" size="-1" color="BLACK">は一意ではなく、2つあります。私が探しているのは、この文字列の2番目の出現です。

編集2:解決策!

with open("output.html") as url: 
    soup = BeautifulSoup(url, 'lxml') 
    tags = soup.findAll('font', {'face': 'Arial', 'size': '-1', 'color': 'BLACK'}) 
    print('There are {} matching tags'.format(len(tags))) 
    print('Second: {}'.format(tags[3])) 

私はこれをインターネット上に残して、同様の問題を抱えている人はドキュメントを理解できません。タグが0の場合は1ではなく0から数えられることに注意してください。tags [0]が最初のインスタンスです。より多くの数字を印刷し続けるだけです。

答えて

0

私はあなたが最初の出現を返すだけでなく、タグのすべての出現のリストを返すfindAllを探していると思います。

希望elemtentsを得るために isliceを使用し
list_of_tags = soup.find_all('font', {'face': 'Arial', 'size': '-1', 'color': 'BLACK'}) 

info = soup.findAll('font', {'face': 'Arial', 'size': '-1'})[4].text 

はあなたが必要なものを与える必要があります...

+0

解決策は独立して見つかりましたが、これは既に持っているものと非常によく似ています。とにかくありがとうございました! – infered5

0

は、あなたが興味を持っているタグのリストを収集し

from itertools import islice 

infos = islice(list_of_tags, 4, 5) 
# will be an empty list if less than 5 elements in it 
if infos: 
    print(infos[0].text) 

これはあなたに何を望みますか?

1

bs.find_allを使用し、最初にNの一致が見つかりました。

result = soup.find_all(
    'font', {'face': 'Arial', 'size': -1, 'color': 'BLACK'}, limit=4 
) 
information = result[-1].text 
print(information) 
+0

私は共有のおかげで、 ''制限 ''の使用が好きです。 –

関連する問題