web-dev-qa-db-fra.com

Beautifulsoup: analyse html - obtenir une partie de href

J'essaye d'analyser

<td height="16" class="listtable_1"><a href="http://steamcommunity.com/profiles/76561198134729239" target="_blank">76561198134729239</a></td>

pour le 76561198134729239. et je ne sais pas comment le faire. ce que j'ai essayé:

import requests
from lxml import html
from bs4 import BeautifulSoup
r = requests.get("http://ppm.rep.tf/index.php?p=banlist&page=154")
content = r.content
soup = BeautifulSoup(content, "html.parser")
element = soup.find("td", 
{
    "class":"listtable_1",
    "target":"_blank"
})
print(element.text)
10
nooby

Il existe de nombreuses entrées de ce type dans ce code HTML. Pour les obtenir tous, vous pouvez utiliser les éléments suivants:

import requests
from lxml import html
from bs4 import BeautifulSoup

r = requests.get("http://ppm.rep.tf/index.php?p=banlist&page=154")
soup = BeautifulSoup(r.content, "html.parser")

for td in soup.findAll("td", class_="listtable_1"):
    for a in td.findAll("a", href=True, target="_blank"):
        print(a.text)

Cela reviendrait alors:

76561198143466239
76561198094114508
76561198053422590
76561198066478249
76561198107353289
76561198043513442
76561198128253254
76561198134729239
76561198003749039
76561198091968935
76561198071376804
76561198068375438
76561198039625269
76561198135115106
76561198096243060
76561198067255227
76561198036439360
76561198026089333
76561198126749681
76561198008927797
76561198091421170
76561198122328638
76561198104586244
76561198056032796
76561198059683068
76561197995961306
76561198102013044
12
Martin Evans

"target":"_blank" est une classe de balise d'ancrage a dans la balise td. Ce n'est pas une classe de balise td.

Vous pouvez l'obtenir comme suit:

from bs4 import BeautifulSoup

html="""
<td height="16" class="listtable_1">
    <a href="http://steamcommunity.com/profiles/76561198134729239" target="_blank">
        76561198134729239
    </a>
</td>"""

soup = BeautifulSoup(html, 'html.parser')

print(soup.find('td', {'class': "listtable_1"}).find('a', {"target":"_blank"}).text)

Production:

76561198134729239
4
MYGz

Comme d'autres l'ont mentionné, vous essayez de vérifier les attributs de différents éléments dans une seule find(). Au lieu de cela, vous pouvez chaîner les appels find() comme suggéré par MYGz, ou utiliser un seul sélecteur CSS :

soup.select_one("td.listtable_1 a[target=_blank]").get_text()

Si, vous devez localiser plusieurs éléments de cette façon, utilisez select():

for Elm in soup.select("td.listtable_1 a[target=_blank]"):
    print(Elm.get_text())
3
alecxe

"class":"listtable_1" appartiennent à la balise td et target="_blank" appartient à la balise a, vous ne devez pas les utiliser ensemble.

tu devrais utiliser Steam Community comme ancre pour trouver les chiffres qui suivent. enter image description here

OU utilisez l'URL, l'URL contient les informations dont vous avez besoin et il est facile à trouver, vous pouvez trouver l'URL et la diviser par /:

for a in soup.find_all('a', href=re.compile(r'steamcommunity')):
    num = a['href'].split('/')[-1]
    print(num)

Code:

import requests
from lxml import html
from bs4 import BeautifulSoup
r = requests.get("http://ppm.rep.tf/index.php?p=banlist&page=154")
content = r.content
soup = BeautifulSoup(content, "html.parser")
for td in soup.find_all('td', string="Steam Community"):
    num = td.find_next_sibling('td').text
    print(num)

en dehors:

76561198143466239
76561198094114508
76561198053422590
76561198066478249
76561198107353289
76561198043513442
76561198128253254
76561198134729239
76561198003749039
76561198091968935
76561198071376804
76561198068375438
76561198039625269
76561198135115106
76561198096243060
76561198067255227
76561198036439360
76561198026089333
76561198126749681
76561198008927797
76561198091421170
76561198122328638
76561198104586244
76561198056032796
76561198059683068
76561197995961306
76561198102013044
3
宏杰李