2017-01-18 8 views
3

Я пытаюсь разобратьPython BeautifulSoup разбора HTML

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

для 76561198134729239., и я не могу понять, как это сделать. что я пробовал:

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) 

ответ

5

Есть много таких записей в этом HTML. Для того, чтобы получить все из них можно использовать следующее:

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) 

Это позволило бы вернуть:

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

"target":"_blank" является класс тега привязки a в td тега. Это не класс тега td.

Вы можете получить его следующим образом:

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) 

Выход:

76561198134729239 
2

"class":"listtable_1" принадлежат td теге и target="_blank" принадлежат a тега, вы не должны использовать их вместе.

вы должны использовать Steam Community в качестве якоря, чтобы найти номера после него. enter image description here

ИЛИ использовать URL, URL-адрес содержит информацию, вам нужно, и это легко найти, вы можете найти URL и разделить его на /:

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

Код:

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) 

:

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

Как уже упоминалось, e пытается проверить атрибуты разных элементов в одном find(). Вместо этого, вы можете цепи find() вызовов как предложено MYGz, или использовать один CSS selector:

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

Если вам нужно найти несколько элементов таким образом, использовать select():

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

 Смежные вопросы

  • Нет связанных вопросов^_^