Вопрос по python, beautifulsoup – BeautifulSoup в Python - получение n-го тега типа

11

У меня есть HTML-код, который содержит многоЯ в этом.

Я пытаюсь получить информацию во второй таблице. Есть ли способ сделать это без использования?soup.findAll('table')

Когда я используюsoup.findAll('table')Я получаю ошибку:

ValueError: too many values to unpack

Есть ли способ получить n-тый тег в каком-то коде или другим способом, который не требует прохождения всех таблиц? Или я должен посмотреть, могу ли я добавить заголовки к таблицам? (лайк )

Есть также заголовки (title) над каждой таблицей, если это поможет.

Благодарю.

РЕДАКТИРОВАТЬ

Вот'Что я думал, когда задавал вопрос:

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

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

Теперь я знаю, что он возвращает список, и я могу использовать его в цикле for или получить значение из него с помощьюsoup.findAll('table')[someNumber], Я узнал, что такое распаковка и как ее использовать. Спасибо всем, кто помог.

Надеюсь, это прояснит ситуацию, теперь, когда я знаю, что ямой вопрос имеет меньше смысла, чем когда я его задавал, поэтому я подумалЯ просто оставлю здесь записку о том, что я думаю.

РЕДАКТИРОВАТЬ 2:

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

Если это кому-нибудь поможет, я пытался распаковатьfindAll(...) результаты, из которых количество я не сделаля знаю

useless_table, table_i_want, another_useless_table = soup.findAll("table");

Так как там не былоt всегда количество таблиц, которые я угадал на странице, и все значения в кортеже нужно распаковать, я получал:ValueError

ValueError: too many values to unpack

Итак, я искал способ получить вторую (или любую другую индексную) таблицу в возвращаемом кортеже, не сталкиваясь с ошибками относительно количества использованных таблиц.

soup.find_all('table') возвращает список.tables = soup.find_all('table') должно сработать Aamir Adnan
Просто делаsoup.findAll('table') делаетне вызватьValueError, Пожалуйста, оставьте свой полный код.too many values to unpack означает, что у вас есть несколько переменных в левом выражении. Martijn Pieters
@nasonfish: ошибка показывает, что у вас более 2 таблиц, поэтому распаковка не удалась. Дон»В этом случае нельзя использовать распаковку кортежей. Martijn Pieters
В верхней части поста я сказал, что использую его в коде со многимив этом. Я'Я использую его на этой странице: view-source:dhmc.us/players/view/nasonfish и я использую этот код:table1, table2 = soup.find_all('table') nasonfish

Ваш Ответ

3   ответа
0

Вот'моя версия

# Import bs4
from bs4 import BeautifulSoup

# Read your HTML
#html_doc = your html

# Get BS4 object
soup = BeautifulSoup(html_doc, "lxml")

# Find next Sibling Table to H3 Header with text "THE GOOD STUFF"    
the_good_table = soup.find(name='h3', text='THE GOOD STUFF').find_next_sibling(name='table')

# Find Second tr in your table
your_tr = the_good_table.findAll(name='tr')[1]

# Find Text Value of First td in your tr
your_string = your_tr.td.text

print(your_string)

Выход:

'I WANT THIS STRING'
2

опыт работы с вложеннымиtable тег, который нарушает мой код, когда я просто получаю вторую таблицу в списке, не обращая внимания.

Когда вы пытаетесьfind_all и получить n-й элемент, есть потенциал, который вы можете испортить, вам лучше найти первый элемент, который вы хотите, и убедиться, что n-й элемент на самом деле является родственным элементом этого элемента вместо дочерних.

Вы можете использоватьfind_next_sibling() чтобы защитить ваш кодсначала вы можете найти родителя, а затем использовать find_all (recursive = False), чтобы гарантировать диапазон поиска.

На всякий случай, если вам это нужно. Я приведу свой код ниже (используйте recursive = FALSE).

import urllib2
from bs4 import BeautifulSoup

text = """

    
    
    
        <p>Table1</p><table>
            
            </table><p>Extra Table</p><table>
                
            </table>
        
        <p>Table2</p><table>
            
        </table>
    

"""

soup = BeautifulSoup(text)

tables = soup.find('body').find_all('table')
print len(tables)
print tables[1].text.strip()
#3
#Extra Table # which is not the table you want without warning

tables = soup.find('body').find_all('table', recursive=False)
print len(tables)
print tables[1].text.strip()
#2
#Table2 # your desired output
17

Чтобы получить второй стол от звонкаsoup.findAll('table'), используйте его как список, просто индексируйте его:

secondtable = soup.findAll('table')[1]
Это сработало отлично. Спасибо! Не уверен, почему я нене думаю об этом раньше. nasonfish
Что значитfindAll('table')[1] на самом деле означает? Это просто найти вторую таблицу или сначала найти все таблицы, а затем получить вторую таблицу? CokileCeoi
@CokileChui Сначала он находит все таблицы, а затем получает вторую таблицу. FindAll является функцией, и ее возвращаемое значение дает список, а затем мы получаем второй элемент Samitha Chathuranga

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