Поиск местоположения класса для BeautifulSoup - PullRequest
0 голосов
/ 23 февраля 2019

Я борюсь с BeautifulSoup.Я хочу почистить ссылки на конкурсы в таблице с правой стороны [Transfermarkt] [1]

Как мне найти это место:

div1 = soup.find('div', {'class': 'large-4 columns'})
div2 = div1.find('div', {'class': 'box'})
table = div2.find('table')
table_body = table.find('tbody')
contest = table_body.find_all('a')

Проблема в том, что этоне достаточно конкретно.Иногда я нахожу двойные значения, которые полностью разрушают мою структуру ...

Есть ли лучший способ найти эту точную позицию?

Позиция, которая мне нужна: "a" "title" внутри"td" "class = no-border-links"

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Лучше использовать select для этого случая.

for title in soup.select('.large-4.columns td.no-border-links > a'):
    if title.text:
        print(title.text)

Вывод будет

Weltmeisterschaft 2014
UEFA Champions League
1.Bundesliga
1.Bundesliga
1.Bundesliga
1.Bundesliga
FC Bayern München
1.Bundesliga
UEFA Champions League
1.Bundesliga
1.Bundesliga
1.Bundesliga
Deutschland
Deutschland
Weltmeisterschaft 2018
Weltmeisterschaft 2014
Weltmeisterschaft 2010
Europameisterschaft 2016
Europameisterschaft 2012
Weltmeisterschaft 2014
U21-Europameisterschaft 2009
UEFA Champions League
1.Bundesliga
Weltmeisterschaft 2010
Deutschland
UEFA Champions League
UEFA Champions League
UEFA Champions League
UEFA Champions League
UEFA Champions League
UEFA Champions League
UEFA Champions League
UEFA Champions League
UEFA Champions League
UEFA Super Cup
FC Bayern München
FC Bayern München
FC Bayern München
Deutschland
FIFA Klub-WM
DFB-Pokal
DFB-Pokal
DFB-Pokal
DFB-Pokal
DFL-Supercup
DFL-Supercup
DFL-Supercup
DFB-SuperCup
DFB-Pokal
U21-Europameisterschaft 2009
0 голосов
/ 23 февраля 2019

Попробуйте следующее, чтобы получить желаемый контент:

import re
import requests
from bs4 import BeautifulSoup

URL = "https://www.transfermarkt.de/jumplist/erfolge/spieler/17259"

res = requests.get(URL,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select(".table-header:contains('Alle Titel') + table tr"):
    if not items.find("a",string=re.compile("\w")):continue
    item = items.find("a",string=re.compile("\w")).text
    print(item)

Чтобы получить ссылку, попробуйте также:

import re
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

URL = "https://www.transfermarkt.de/jumplist/erfolge/spieler/17259"

res = requests.get(URL,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select(".table-header:contains('Alle Titel') + table tr"):
    if not items.find("a",string=re.compile("\w")):continue
    item = items.find("a",string=re.compile("\w")).text
    try:
        link = urljoin(URL,items.select_one("a[href^='/']").get("href"))
    except AttributeError: link = ""
    print(item,link)
0 голосов
/ 23 февраля 2019

Попробуйте использовать функцию select в библиотеке супа, где вы можете использовать CSS-селекторы .

В вашем случае вы можете использовать что-то вроде -

a_tags = soup.select("td[class='no-border-links'] > a")

Теперь вы можете повторить это, чтобы получить заголовки, используя атрибут text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...