2016-02-27 3 views
1

Я новичок в Python, и в настоящее время я работаю над решением проблем, чтобы улучшить свои навыки кодирования. Я отправил форму с использованием python и со следующей страницы, отображаемой после отправки формы, я хочу собрать некоторые данные и отобразить их в моем выпуске. Необходимые данные, которые я хочу собрать, находятся между <TR> </TR> тегами и есть много <TR> </TR> как на этой странице.Parsing <TR></TR> теги и печать элементов с помощью BeautifulSoup в Python

для справки:

<TR class="even"><TD class="id">6422275</TD><TD class="date"><NOBR>09:06:49</NOBR><BR><NOBR>27 Feb 2016</NOBR></TD><TD class="coder"><A HREF="author.aspx?id=201837">THE_ROCK</A></TD><TD class="problem"><A HREF="problem.aspx?space=1&amp;num=1000">1000<SPAN CLASS="problemname">. A+B Problem</SPAN></A></TD><TD class="language">Python 2.7</TD><TD class="verdict_ac">Accepted</TD><TD class="test"><BR></TD><TD class="runtime">0.015</TD><TD class="memory">160 KB</TD></TR> 

Таким образом, из всего HTML страницы, я хочу, чтобы прочитать имя, THE_ROCK (он присутствует в приведенном выше поддавки тег), и если что существует в этой странице, я хочу чтобы напечатать полные элементы (например, проблему, имя проблемы, verdict_ac, время выполнения и память) в этом теге <TR> </TR>. Я понял, что могу использовать BeautifulSoup, но я не знаю, как сравнивать вещи и печатать нужные элементы/теги.

Код:

res = br.submit() 
    final_url = res.geturl() 
    html_doc = br.open(final_url) 
    html_read = (html_doc.read()) 
    soup = BeautifulSoup(data, convertEntities=BeautifulSoup.HTML_ENTITIES) 
    for row in soup.find_all('TR'): 
     print '\n'.join(row.stripped_strings) 

Я пытаюсь найти TR тег, но это не было полезным и никакого вывода не печатается. Может кто-нибудь сказать мне, где я делаю неправильно. Является ли мой подход неправильным или поток неправильный? Не могли бы вы рассказать мне, почему я не могу получить результат, как ожидалось. Заранее спасибо. Любая помощь приветствуется.

+0

Когда я нахожу текст 'THE_ROCK', я хочу, чтобы напечатать весь' TR' тег, в котором этот текст существует – Dev

ответ

2

Найти элемент по тексту и найдите tr родителя с помощью find_parent():

tr = soup.find(text="THE_ROCK").find_parent("tr") 
+0

Спасибо, приятель, это было очень полезно! :) – Dev

+0

Один последний запрос, так что теперь у меня есть все необходимое содержимое в переменной 'tr', теперь как мне печатать их отдельно, например' 09:06:49
27 фев 2016
, <тд класс = "кодировщик">THE_ROCK, <тд класс = "проблема">1000. A+B Problem, <тд класс = "язык"> Python 2.7, 'и так далее. Могу ли я снова назначить 'tr' в BeautifulSoup, а затем проанализировать его? – Dev

+0

@Dev 'tr' - это экземпляр« Tag », и вы можете искать его непосредственно внутри, используя' find() 'или' find_all() 'или любой другой метод, доступный на объекте' soup'. Например: 'tr.find (" td ", class _ =" language "). Text'. – alecxe

1

Может быть, это поможет:

soup = BeautifulSoup(devs_html, 'html.parser') 
row = soup.find_all('tr', class_='even') 

In [195]: row 
Out[195]: [<tr class="even"><td class="id">6422275</td><td class="date"><nobr>09:06:49</nobr><br><nobr>27 Feb 2016</nobr></br></td><td class="coder"><a href="author.aspx?id=201837">THE_ROCK</a></td><td class="problem"><a href="problem.aspx?space=1&amp;num=1000">1000<span class="problemname">. A+B Problem</span></a></td><td class="language">Python 2.7</td><td class="verdict_ac">Accepted</td><td class="test"><br/></td><td class="runtime">0.015</td><td class="memory">160 KB</td></tr>] 

In [196]: row[0].contents 
Out[196]: 
[<td class="id">6422275</td>, 
<td class="date"><nobr>09:06:49</nobr><br><nobr>27 Feb 2016</nobr></br></td>, 
<td class="coder"><a href="author.aspx?id=201837">THE_ROCK</a></td>, 
<td class="problem"><a href="problem.aspx?space=1&amp;num=1000">1000<span class="problemname">. A+B Problem</span></a></td>, 
<td class="language">Python 2.7</td>, 
<td class="verdict_ac">Accepted</td>, 
<td class="test"><br/></td>, 
<td class="runtime">0.015</td>, 
<td class="memory">160 KB</td>] 

Ok, так что в основном мы просто искали строк через класс строки (строки таблицы:). Это должно дать вам список строк, которые можно перебрать.

Просто взяв одну строку, строку [0], в качестве примера вы можете увидеть, что у вас есть все данные(), содержащиеся в строке. Для того, чтобы получить информацию из них, вы можете сделать:

In [197]: row[0].find(class_='id').text 
Out[197]: u'6422275' 

In [198]: row[0].find(class_='coder').text 
Out[198]: u'THE_ROCK' 

И так далее, пока вы не всю информацию вы хотите.

EDIT: Хорошо, если вы просто хотите, чтобы найти THE_ROCK и напечатать строку:

for r in row: 
    if 'THE_ROCK' in r.find(class_='coder').text: 
     print(r) 

Это должно дать вам всю строку, и вы можете делать то, что все, что вы хотите с ним.

+0

делает ' строка [0] 'означает, что это первая строка? и класс не всегда равен :(Иногда это может быть и нечетным. В основном это динамически меняется. – Dev

+1

строка [0] - это первый элемент в списке, созданный soup.find_all. Когда вы перебираете список, как вы это делаете в ваш пример выше с «для строки в soup.find_all (« TR »), строка [0] будет первым элементом в итерации. Класс, вероятно, чередуется между нечетными/четными, правильно? Я предполагаю, из-за чередования цветов фона Вы можете сделать 'soup.findall (' tr ', class _ =' even ') + soup.find_all (' tr ', class _ =' odd ') " – antikantian

+0

Да, правильно, это либо или даже. Хорошо, теперь я получил ваш login mate :) спасибо – Dev

Смежные вопросы