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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top