Question

j'essaie de gratter http://www.co.jefferson.co.us/ ats / displaygeneral.do? sch = 000104 et obtenez le " nom (s) du propriétaire " Ce que j'ai fonctionne mais est vraiment moche et pas le meilleur, j'en suis sûr, alors je cherche un meilleur moyen. Voici ce que j'ai:

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

Le code HTML pertinent est

<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, il y a beaucoup de questions sur beautifulsoup, je les ai parcourues mais je n'ai trouvé aucune réponse qui m'a aidé, espérons que ce ne soit pas une question en double

Était-ce utile?

La solution

( Modifier : apparemment, le code HTML affiché par le PO est en réalité. Il n'y a en fait aucune balise tbody à rechercher, même s'il a mis un point d'honneur à l'inclure dans Donc, changer pour utiliser table au lieu de tbody ).

Puisqu'il peut y avoir plusieurs lignes de table que vous souhaitez (par exemple, consultez l'URL de votre frère vers celle que vous donnez, avec le dernier chiffre, 4, remplacé par 5), je suggère une boucle du type suivant:

# 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

cela résiste assez bien aux changements mineurs dans la structure de la page: après avoir localisé la cellule d'intérêt, il boucle ses parents jusqu'à ce qu'il trouve la balise table, puis sur toutes les chaînes de navigation de cette table qui ne sont pas vides (ou simplement des espaces). ), à l'exclusion de l'en-tête owner .

Autres conseils

C’est la réponse d’Aaron DeVore du groupe de discussion Beautifulsoup: cela fonctionne bien pour moi.

soup = BeautifulSoup(...)
label = soup.find(text="Owner Name(s)")

Nécessite Tag.string pour accéder à la chaîne de nom réelle

name = label.findNext('td').string

Si vous en faites un tas, vous pouvez même aller pour une compréhension de la liste.

names = [unicode(label.findNext('td').string) for label in
soup.findAll(text="Owner Name(s)")]

Il s’agit d’une légère amélioration, mais je ne savais pas comment me débarrasser des trois parents.

x[0].parent.parent.parent.findAll('td')[1].string
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top