Как бы я поцарапал несколько таблиц, используя индексы с BeautifulSoup? - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь очистить этот URL, чтобы получить только определенные индексы. В этом случае, я показал пример, я могу очистить индекс 6, который даст мне любой URL, который начинается с / wiki /. который даст мне все TLD, начинающиеся с буквы A. Я хотел бы получить все индексы, которые я нахожу относящимися к моей задаче.

На данный момент я попытался перечислить их как таковые [6, 7, 8 и т. Д.] И в цитатах. Я не очень много работаю со списками, и мне нужно потратить еще немного времени на изучение.

import requests
from bs4 import BeautifulSoup 

page = requests.get('https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains')
soup = BeautifulSoup(page.text, 'lxml')

table = soup.findAll('table')[6]
for record in table.findAll('tr'):
    for data in record.findAll('td'):
        for link in data.select("a[href^='/wiki/.']"):
            links = link.contents[0]
            print(links)

Однако, поскольку я новичок в программировании, я не уверен, как добавить несколько индексов помимо 6. Вот ошибки, которые я получаю:

======= RESTART: /run/media/sean/The Continuum/Python/wikinamelist.py =======
Traceback (most recent call last):
  File "/run/media/sean/The Continuum/Python/wikinamelist.py", line 7, in <module>
    table_data = soup.find_all('table')["6", "7"]
TypeError: list indices must be integers or slices, not tuple
>>> 
======= RESTART: /run/media/sean/The Continuum/Python/wikinamelist.py =======
Traceback (most recent call last):
  File "/run/media/sean/The Continuum/Python/wikinamelist.py", line 7, in <module>
    table_data = soup.find_all('table')[6, 7];
TypeError: list indices must be integers or slices, not tuple
>>> 
======= RESTART: /run/media/sean/The Continuum/Python/wikinamelist.py =======
Traceback (most recent call last):
  File "/run/media/sean/The Continuum/Python/wikinamelist.py", line 7, in <module>
    table_data = soup.find_all('table')[6, 7, 8];
TypeError: list indices must be integers or slices, not tuple

Как вы можете видеть выше, у меня есть несколько методов, которые я попытался показать в сообщении об ошибке.

Любые отзывы будут оценены, спасибо!

Ответы [ 2 ]

0 голосов
/ 23 мая 2019
import requests
from bs4 import BeautifulSoup 

page = requests.get('https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains')
soup = BeautifulSoup(page.text, 'html.parser')

a = soup.select('table:nth-of-type(5) td:first-of-type')
b = soup.select('table:nth-of-type(6) td:first-of-type')
c = soup.select('table:nth-of-type(7) td:first-of-type')
d = soup.select('table:nth-of-type(8) td:first-of-type')
e = soup.select('table:nth-of-type(9) td:first-of-type')
f = soup.select('table:nth-of-type(10) td:first-of-type')
g = soup.select('table:nth-of-type(11) td:first-of-type')
h = soup.select('table:nth-of-type(12) td:first-of-type')
ij = soup.select('table:nth-of-type(13) td:first-of-type')
k = soup.select('table:nth-of-type(14) td:first-of-type')
l = soup.select('table:nth-of-type(15) td:first-of-type')
m = soup.select('table:nth-of-type(16) td:first-of-type')
n = soup.select('table:nth-of-type(17) td:first-of-type')
opq = soup.select('table:nth-of-type(18) td:first-of-type')
r = soup.select('table:nth-of-type(19) td:first-of-type')
s = soup.select('table:nth-of-type(20) td:first-of-type')
t = soup.select('table:nth-of-type(21) td:first-of-type')
uv = soup.select('table:nth-of-type(22) td:first-of-type')
wxyz = soup.select('table:nth-of-type(23) td:first-of-type')


print(a, b, c, d, e, f, g, h, ij, k, l, m, n, opq, r, s, t, uv, wxyz)

Это самый простой способ очистить несколько списков на странице. Это будет индивидуально нацелено как на первый столбец, так и на каждой таблице.

Ответ выше помог с моим вопросом! Тем не менее, я внес изменение в предложение выше. Вместо того, чтобы сокращать код, как предложено, я вместо этого создал список переменных, которые бы выбирали таблицу, которую я запрашивал. Затем я распечатал информацию из переменных в STDout. Этот код более читабелен и более модульный.

Переменные также соответствуют именам таблиц.

Спасибо за помощь, это стало очень просто после вашего предложения.

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

Вы можете использовать nth-of-type с разделением запятыми

table:nth-of-type(6), table:nth-of-type(7), table:nth-of-type(8)

Итак,

tables = soup.select('table:nth-of-type(6), table:nth-of-type(7), table:nth-of-type(8)')

Тогда

for table in table:

Вы также можете сжать

links = [item['href'] for item in soup.select("table:nth-of-type(6) [href^='/wiki/.'], table:nth-of-type(7) [href^='/wiki/.'], table:nth-of-type(8) [href^='/wiki/.']")

Вы также можете выбрать селектор типа table для селектора класса, например, .wikitable.Это было бы быстрее.


pd.read_html:

Если pd.read_html возвращает таблицы, вы можете просто проиндексировать / вырезать в этом списке, чтобы получить необходимые таблицы.

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