Я пытаюсь собрать информацию о результатах выборов в 18 избирательных округах Северной Ирландии здесь:
Каждый из уникальных 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-адресов? Спасибо!
Извините, но это не помогает... другое приложение
Кажется, это работает.
Я удалил некоторые ненужные импорты и вещи, которые здесь не нужны, просто прочитайте их, если они вам нужны в другом месте, конечно.
Сообщение об ошибке было связано с попыткой выполнить сравнение регулярных выражений для объекта супа, его необходимо преобразовать в строку (та же проблема, что обсуждалась в ссылке, опубликованной @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 Отлично, рад слышать! Не забудьте отметить мой ответ как принятый ответ, чтобы помочь другим найти решение.
Только что сделал это! Еще раз спасибо!
Это должно помочь: stackoverflow.com/questions/57417684/…