BeautifulSoup Wert in der Tabelle erhalten
-
08-07-2019 - |
Frage
Ich versuche, zu kratzen http://www.co.jefferson.co.us/ ats / displaygeneral.do? sch = 000104 und erhalten den „Eigentümer Name (n)“ Was ich habe funktioniert, aber ist wirklich hässlich und nicht das Beste, was ich bin sicher, so dass ich bin auf der Suche nach einem besseren Weg. Hier ist, was ich habe:
soup = BeautifulSoup(url_opener.open(url))
x = soup('table', text = re.compile("Owner Name"))
print 'And the owner is', x[0].parent.parent.parent.tr.nextSibling.nextSibling.next.next.next
Die entsprechende HTML ist
<td valign="top">
<table border="1" cellpadding="1" cellspacing="0" align="right">
<tbody><tr class="tableheaders">
<td>Owner Name(s)</td>
</tr>
<tr>
<td>PILCHER DONALD L </td>
</tr>
</tbody></table>
</td>
Wow, gibt es viele Fragen zu beautifulsoup ich durch sie sah aber eine Antwort, die mir geholfen, nicht das finden, hoffentlich ist dies nicht eine doppelte Frage
Lösung
( Bearbeiten :. Anscheinend die HTML die OP Lügen geschrieben - es ist in der Tat kein tbody
Tag zu suchen, auch wenn er es machte einen Punkt in diesem HTML einschließlich Also, Wechsel zu verwenden table
statt tbody
).
Da es sein kann, mehrere Tabellenzeilen Sie wollen (siehe zB die Geschwister URL zu der von Ihnen geben, mit der letzten Ziffer, 4, verwandelte sich in einen 5), schlage ich eine Schleife wie folgt:
# locate the table containing a cell with the given text
owner = re.compile('Owner Name')
cell = soup.find(text=owner).parent
while cell.name != 'table': cell = cell.parent
# print all non-empty strings in the table (except for the given text)
for x in cell.findAll(text=lambda x: x.strip() and not owner.match(x)):
print x
Das ist ziemlich robust zu geringfügigen Änderungen in Seitenstruktur: die Zelle von Interesse gelegen hat, Schleife es seine Eltern, bis sie den Tisch Tag, dann über alle schiffbaren Strings innerhalb dieser Tabelle, die nicht leer sind (oder nur Leerzeichen gefunden werden ), mit Ausnahme der owner
-Header.
Andere Tipps
Dies ist Aaron DeVore Antwort von der BeautifulSoup Diskussionsgruppe, Es funktioniert gut für mich.
soup = BeautifulSoup(...)
label = soup.find(text="Owner Name(s)")
Anforderungen Tag.string auf den tatsächlichen Namen String erhalten
name = label.findNext('td').string
Wenn Sie ein paar von ihnen tun, können Sie auch für eine Liste Verständnis gehen.
names = [unicode(label.findNext('td').string) for label in
soup.findAll(text="Owner Name(s)")]
Dies ist eine leichte Verbesserung, aber ich kann nicht herausfinden, wie die drei Eltern loszuwerden.
x[0].parent.parent.parent.findAll('td')[1].string