Соскоб википедии инфобокс география vcard - PullRequest
0 голосов
/ 24 мая 2019

Я тоже пытался собрать данные из раздела «Веб-сайт» из таблицы vcard разных городов в Википедии, но каким-то образом я получаю результаты для раздела «Координаты», который расположен в начале таблицы, вне таблицы

Я пытался указать "Веб-сайт" при выборе конкретных тегов в таблице.

def getAdditionalInfo(url):
    try:
        city_page = PageContent('https://en.wikipedia.org' + url)
        table = city_page.find('table', {'class' : 'infobox geography vcard'})
        additional_details = []
        read_content = False
        for tr in table.find_all('tr'):
            if (tr.get('class') == ['mergedtoprow'] and not read_content):
                link = tr.find('th')
                if (link and (link.get_text().strip() == 'Website')):
                    read_content = True
            elif ((tr.get('class') == ['mergedbottomrow']) or tr.get('class') == ['mergedrow'] and read_content):
                additional_details.append(tr.find('td').get_text().strip('\n'))
        return additional_details
    except Exception as error:
        print('Error occured: {}'.format(error))
        return []

Я хочу добавить эти данные в новый столбец, который показывает ссылку на веб-сайт для официальной страницы каждого города, которую я получал бы с помощью этой функции

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

С помощью bs4 4.7.1 вы можете использовать :contains, чтобы указать заголовок таблицы на website, а затем получить следующий атрибут тега href.Ясно, что есть другие случаи, когда этот шаблон может совпадать, поэтому, возможно, для входных значений требуется некоторая другая форма проверки.

Вы можете добавить дополнительный селектор класса для vcard, если хотите: result = soup.select_one('.vcard th:contains(Website) + td > [href]')

Python

import requests
from bs4 import BeautifulSoup as bs

cities = ['Paris', 'Frankfurt', 'London']
base = 'https://en.wikipedia.org/wiki/'

with requests.Session() as s:
    for city in cities:
        r = s.get(base + city)
        soup = bs(r.content, 'lxml')
        result = soup.select_one('th:contains(Website) + td > [href]') 
        if result is None:
            print(city, 'selector failed to find url')
        else:
            print(city, result['href'])
0 голосов
/ 25 мая 2019

Как я правильно понимаю проблему, вы хотите извлечь официальный URL города из Википедии:

import requests
from bs4 import BeautifulSoup

def getAdditionalInfo(url):
    soup = BeautifulSoup(requests.get('https://en.wikipedia.org' + url).text, 'lxml')
    for th in soup.select('.vcard th'):
        if not th.text.lower() == 'website':
            continue
        yield th.parent.select_one('td').text

cities = ['/wiki/Paris', '/wiki/London', '/wiki/Madrid']

for city in cities:
    for info in getAdditionalInfo(city):
        print(f'{city}: {info}')

Это печатает:

/wiki/Paris: www.paris.fr
/wiki/London: london.gov.uk
/wiki/Madrid: www.madrid.es
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...