Есть ли способ в Python / BeautifulSoup выбрать конкретную строку в списке похожих строк? - PullRequest
1 голос
/ 18 апреля 2019

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

Я пытаюсь провести некоторую очистку данных на сайте Box Office Mojo.Я пытаюсь создать CSV-файл, который выбирает таблицу для каждого кассового хита каждой страны за каждый год (см. https://www.boxofficemojo.com/intl/austria/yearly/?yr=2019&p=.htm

. Мне удалось использовать BeautifulSoup, чтобы захватить определенную страницу и проанализировать ее:

pip install bs4
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

##Creating a variable for the URL I want to use
my_url = 'https://www.boxofficemojo.com/intl/austria/yearly/?yr=2019&p=.htm'

uReq(my_url)
### Opening up connecting, grabbing the page, closing the connection
uClient = uReq(my_url)
page_html = uClient.read() ###Don't run page_html because it may crash the client
uClient.close()
##Using BeuatifulSoup to read the html page and parsing it
page_soup = soup(page_html,"html.parser")

Мне удалось выделить конкретную строку html, из которой я хочу получить информацию:

container_odd = page_soup.findAll("tr", {"bgcolor":"#ffffff"})
container_even = page_soup.findAll("tr", {"bgcolor":"#f4f4ff"})

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

>>>>container_even[0]
<tr bgcolor="#f4f4ff"><td align="center"><font size="2">2</font></td>
<td><font size="2">How to Train Your Dragon: The Hidden World</font></td>
<td><font size="2">UPI</font></td>
<td align="right"><font size="2"><b>$2,701,010</b></font></td>
<td align="center"><font size="2">2/8</font></td>
</tr>
>>> container_odd[0].text
'1\nCaptain Marvel\nDisney\n$3,221,398\n3/7\n'

Я также могу вызвать первый «элемент td» (я не знаю, как это назвать) в строке:

>>> container_odd[0].td.text
'1'

Я не могу на всю жизнь понять, как вытащить этот второй «тд-элемент» в строке, т. Е. «Капитан Марвел».

Теперь я хочу создатьцикл, который будет извлекать каждый отдельный элемент td из каждой строки в container_even / odd для помещения в список.

Итак, я хочу, чтобы rank_list содержал «1, 2, 3, 4 ...» (или, скорее,«1,3,5 ...» и «2,4,6 ...» из-за кода в данном случае)

и списка заголовков, содержащего «Captain Marvel, H»а теперь дрессировать своего дракона ... '

Чего я не могу понять, так это как вытащить этот второй «тд предмет», а затем как перебрать этот предмет в каждом ряду?

Я пытался получить хотя бы список элементов ранга:

    rank  = td[]

    print("rank: " + rank)

Но только что получил синтаксическую ошибку

  File "scraper.py", line 25
    rank  = td[]
               ^
SyntaxError: invalid syntax

Любая помощь в создании цикла или, по крайней мере, выяснение, какчтобы вытащить этот второй элемент ТД будет очень признателен!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Я бы просто использовал панд как можно проще.Вы можете вырезать столбцы, если вам нужны отдельные списки, например list(table['Movie Title'])

Полная таблица:

import pandas as pd

table = pd.read_html('https://www.boxofficemojo.com/intl/austria/yearly/?yr=2019&p=.htm')[2]
table.columns = table.iloc[0]
table = table.iloc[1:]
print(table)
table.to_csv(r'C:\Users\User\Desktop\Data.csv', sep=',', encoding='utf-8-sig',index = False )
0 голосов
/ 18 апреля 2019

Глядя на ваш код в комментариях:

container_odd [0] .text '1 \ nCaptain Marvel \ nDisney \ n $ 3,221,398 \ n3 / 7 \ n'

Вы должны иметь возможность перебирать объект «container_odd» и получать все строки таким образом, используя цикл for.Например:

for line in container_odd:
    raw_text = line.text
    content_list = raw_text.split('\n')
    print(content_list)

Объектом «line» будет каждая строка объекта «container_odd», а «raw_text» будет выглядеть так же, как то, что вы вытащили (то, что я показываю вкомментарии), и разделив его на каждый символ '\ n', вы получите список, соответствующий таблице, которую вы перетащили.

Чтобы сохранить это в csv, попробуйте следующее:

def my_csv_writer(text):
    with open(*full\\path\\filename.csv*, 'a+') as file:
        file.write(text)
        file.write('\n')

for line in container_odd:
    raw_text = line.text
    content_list = raw_text.replace(',','').split('\n')
    write_text = ','.join(content_list)
    my_csv_writer(write_text)

Эта функция будет выполнять функцию записи, и когда вы выполняете цикл for и вызываете функцию записи, вы можете записывать текст в файл по одной строке за раз.

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