2017-02-24 4 views
0
resp = urlopen('http://international.o2.co.uk/internationaltariffs 
/getintlcallcosts?countryId=IND').read() 
crawler = bs4.BeautifulSoup(resp, 'html.parser') 
div = crawler.find('div', {"id": "standardRates"}) 
div 

enter image description hereScreen Scraping mit BeautifulSoup in Python

Mit dem obigen Code listet es alle Tags/Elemente, die Sie im Bild sehen können. Ich möchte die "2,00 €" bekommen. Außer, wenn ich wieder anrufen .find (‚td‘) wie folgt:

div = crawler.find('div', {"id": "standardRates"}).find('td') 

es liefert nur Festnetz und nicht über die Linie unten, auch wenn sie den gleichen Tag hat. Ich habe sehr wenig Erfahrung im Web Scraping. Wie kann ich dieses Tag (die Linie mit den £ 2,00) anvisieren?

+3

Versuch 'findAll()' statt nur 'finden()' ' – MooingRawr

+3

.findAll ('td') [1]' um genau zu sein –

+0

Großen, die gearbeitet. Obwohl die Ergebnisse eine Liste sind, wird die Zeichenfolge bei Verwendung von .contents von eckigen Klammern umgeben. Kann ich es bekommen, so ist es nur eine Zeichenfolge? – Paulos

Antwort

1

Sie können diesen Ansatz verwenden, um ziemlich direkt zum vorherigen Geschwister von £ 2,00 zu gehen.

Zuerst finden Sie die gewünschte Tabelle, dann finden Sie die td mit Landline darin als eine Zeichenfolge. Dann holen Sie das Elternteil von diesem td, bekommen Sie das nächste Geschwister von diesem, und schließlich das nächste Geschwister.

>>> import requests 
>>> get = requests.get('http://international.o2.co.uk/internationaltariffs/getintlcallcosts?countryId=IND') 
>>> page = get.text 
>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(page,'lxml') 
>>> Landline_td = soup.find('table', {'id': 'standardRatesTable'}).find_all(string='Landline')[0] 
>>> Landline_td 
'Landline' 
>>> Landline_td.findParent().findNextSibling() 
<td>£2.00</td> 
>>> Landline_td.findParent().findNextSibling().text 
'£2.00'