Попытка очистить несколько URL-адресов с одной страницы

Я пытаюсь собрать информацию о результатах выборов в 18 избирательных округах Северной Ирландии здесь:

http://www.eoni.org.uk/Elections/Election-results-and-statistics/Election-results-and-statistics-2003-onwards/Elections-2019/UK-Parliamentary-Election-2019-Results

Каждый из уникальных URL-адресов начинается так:

http://www.eoni.org.uk/Elections/Election-results-and-statistics/Election-results-and-statistics-2003-onwards/Elections-2019/

Селектор для 18 URL выглядит следующим образом:

#container > div.two-column-content.clearfix > div > div.right-column.cms > div > ul > li

Я хочу начать с списка с 18 URL-адресами. Этот список должен быть чистым (т.е. иметь только фактические адреса, без тегов и т. д.)

Мой код до сих пор:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
from time import sleep
from random import randint
from selenium import webdriver

url = 'http://www.eoni.org.uk/Elections/Election-results-and-statistics/Election-results-and-statistics-2003-onwards/Elections-2019/UK-Parliamentary-Election-2019-Results'

response = requests.get(url)
response.status_code

text = requests.get(url).text

soup = BeautifulSoup(text, parser = "html5lib")

link_list = []
for a in soup('a'):
    if a.has_attr('href'):
        link_list.append(a)

re_pattern = r"^/Elections/Election-results-and-statistics/Election-results-and-statistics-2003-onwards/Elections-2019/"

Вот где я теряюсь, так как мне нужно искать все 18 URL-адресов, которые начинаются с этого шаблона (Шаблон неверен, я почти уверен. Пожалуйста, помогите!)

Остальной код:

import re
good_urls = [url for url in link_list if re.match(re_pattern, url)]

здесь я получаю эту ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-f3fbbd3199b1> in <module>
----> 1 good_urls = [url for url in link_list if re.match(re_pattern, url)]

<ipython-input-36-f3fbbd3199b1> in <listcomp>(.0)
----> 1 good_urls = [url for url in link_list if re.match(re_pattern, url)]

~/opt/anaconda3/lib/python3.7/re.py in match(pattern, string, flags)
    173     """Try to apply the pattern at the start of the string, returning
    174     a Match object, or None if no match was found."""
--> 175     return _compile(pattern, flags).match(string)
    176 
    177 def fullmatch(pattern, string, flags=0):

TypeError: expected string or bytes-like object

Что я должен ввести по-другому, чтобы получить эти 18 URL-адресов? Спасибо!

Это должно помочь: stackoverflow.com/questions/57417684/…

Huzefa Sadikot 12.12.2020 09:36

Извините, но это не помогает... другое приложение

chefbilby 12.12.2020 10:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, это работает.

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

Сообщение об ошибке было связано с попыткой выполнить сравнение регулярных выражений для объекта супа, его необходимо преобразовать в строку (та же проблема, что обсуждалась в ссылке, опубликованной @Huzefa, так что это определенно актуально).

При исправлении этого по-прежнему оставалась проблема с попыткой изолировать правильные строки. Я упростил регулярное выражение для сопоставления, затем использовал простое разделение строки на " и выбрал второй объект, полученный в результате разделения (который является нашим URL-адресом)

import requests
from bs4 import BeautifulSoup
import re
url = 'http://www.eoni.org.uk/Elections/Election-results-and-statistics/Election-results-and-statistics-2003-onwards/Elections-2019/UK-Parliamentary-Election-2019-Results'
response = requests.get(url)
text = requests.get(url).text
soup = BeautifulSoup(text, "html.parser")
re_pattern = "<a href=\".*/Elections-2019/.*"
link_list = []
for a in soup('a'):
    if a.has_attr('href') and re.match(re_pattern, str(a)):
        link_list.append((str(a).split('"')[1]))

Надеюсь, это соответствует вашей цели, спросите, если что-то неясно.

Извините, что не ответил раньше, но спасибо за решение! Очень аккуратный!

chefbilby 21.01.2021 09:40

@chefbilby Отлично, рад слышать! Не забудьте отметить мой ответ как принятый ответ, чтобы помочь другим найти решение.

PMental 24.01.2021 18:44

Только что сделал это! Еще раз спасибо!

chefbilby 25.01.2021 15:02

Другие вопросы по теме

Похожие вопросы