Beautifulsoup разбирает плохие теги - PullRequest
0 голосов
/ 15 декабря 2011

Насколько я понимаю, регулярное выражение - это подход бедного человека к работе с Beautifulsoup, но мне было интересно, если это единственный вариант, если в html, который я пытаюсь разобрать, нет четко определенных тегов?

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

<table width="733" border="0" cellpadding="2">
<tr>
<td align="right" valign="top" nowrap="nowrap" bgcolor="#29ff36">
<font size="-1" face="Verdana, Arial, Helvetica, sans-serif">
<strong>
PART CODE:
</strong>
</font>
</td>
<td align="left" valign="top" nowrap="nowrap">
<font size="-1" color="#7b1010" face="Verdana, Arial, Helvetica, sans-serif">
PART#  (//THIS IS WHAT I WANT)
</font>
</td>
<td>
</td>

Есть ли хороший способ приблизиться к этому без регулярных выражений?

Спасибо за помощь, ребята. Этот сайт невероятен

OK

Существует около 15 таких таблиц, каждая из которых имеет метку (например, «Стоимость», «Поставщик», «В наличии»), которая находится в первой ячейке, а затем данные, которые мне действительно нужны, всегда находятся в следующей ячейке.

label = 'Price:'
rows = soup.findAll('tr')
for tr in rows:
  cols = tr.findAll('td')
  for td in cols:
    if td.find(text=True) == label:
      print td.find(text=True)

Это работает достаточно хорошо, чтобы найти правильную ячейку с меткой в ​​ней ... Мне просто нужно найти следующую ячейку сейчас, я думаю. Команда «next» в документации по Beautifulsoup на самом деле не выполняет этого. Есть мысли?

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

Вы также можете сделать это с lxml вместо beautifulsoup. Я переключился на использование lxml.html вместо beautifulsoup из-за метода cssselect(). Он принимает правила CSS, как если бы вы использовали файл CSS или JQuery.

from lxml.html import fromstring

raw_html_data = """ ... your html data here ... """

doc = fromstring(raw_html_data)
part_number = doc.cssselect('td[align=left] font')[0].text
# part_number.strip() # optionally strip leading and trailing whitespace

Вы можете использовать pip для установки lxml.

$ pip install lxml

Раствор серебряного блюда:

# ... starting with doc from above
info = []
target_trs = doc.cssselect('table tr')  # tweak based on actual html
for tr in trs:
    target_cells = tr.cssselect('td font')
    label = target_cells[0].text.strip()
    data = target_cells[1].text.strip()
    info.append((label,data))
# now you have an array of (label,data) pairs in info
0 голосов
/ 16 декабря 2011

Пример, который вы предоставили, не совсем понятен, но вот фрагмент, который извлечет Part # из вашего примера HTML-источника:

columns = soup.findAll('td')
for col in columns:
    try:
        part = col.find("font", {"color": "#7b1010"}).contents[0]
        print(part)
    except:
        pass
0 голосов
/ 16 декабря 2011

Пользователи lxml утверждают, что хорошо работают с искаженным HTML.

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