2015-06-29 3 views
1

У меня есть этот локальный веб-сайт, и я хочу, чтобы извлечь каждую строку послеPython извлечь данные из локального файла HTML

<font color='000000'> <u>PATTERN:</font> 

Вот исходный код страницы, это выход из программы ApproxMAP на Google Code:

<! Created by program ApproxMAP by Hye-Chung(Monica) Kum> 
<HTML><font size=5 face='Helvetica-Narrow'><b> 
<font color='000000'> Cluster Support= [Pattern=</font> 
<font color='000000'> 50</font> 
<font color='000000'> % : Variation=</font> 
<font color='000000'> 20</font> 
<font color='000000'> %]; Database Support= [Min= </font> 
<font color='000000'> 1</font> 
<font color='000000'> seq: Max=</font> 
<font color='000000'> 50</font> 
<font color='000000'> %]</font> 
<BR> 
<font color='a9a9a9'> cluster=0 size=3</font> 
<font color='000000'> =<100:</font> 
<font color='434343'> 85:</font> 
<font color='767676'> 70:</font> 
<font color='a9a9a9'> 50:</font> 
<font color='c8c8c8'> 35:</font> 
<font color='e1e1e1'> 20></font> 
<BR> 
<font color='000000'> <u>PATTERN:</font> 
<font color='000000'> {1,} {2,3,} {4,5,} 
</font> 
<font color='000000'> =</font> 
<font color='000000'> 5</font> 
<font color='000000'> </u></font> 
<BR> 
<font color='000000'> {</font> 
<font color='000000'> 1</font> 
<font color='cbcbcb'> 12</font> 
<font color='000000'> }</font> 
<font color='000000'> {</font> 
<font color='cbcbcb'> 24</font> 
<font color='000000'> }</font> 
<font color='000000'> {</font> 
<font color='7f7f7f'> 2</font> 
<font color='7f7f7f'> 3</font> 
<font color='cbcbcb'> 25</font> 
<font color='000000'> }</font> 
<font color='000000'> {</font> 
<font color='cbcbcb'> 1</font> 
<font color='7f7f7f'> 4</font> 
<font color='7f7f7f'> 5</font> 
<font color='000000'> }</font> 
<font color='000000'> {</font> 
<font color='cbcbcb'> 26</font> 
<font color='000000'> }</font> 
<BR> 
<font color='000000'> <u>PATTERN:</font> 
<font color='000000'> {9,10,} {11,} {12,13,} 
</font> 
<font color='000000'> =</font> 
<font color='000000'> 5</font> 
<font color='000000'> </u></font> 
<BR> 
<font color='000000'> {</font> 
<font color='717171'> 9</font> 
<font color='989898'> 10</font> 
<font color='000000'> }</font> 
<font color='000000'> {</font> 
<font color='d3d3d3'> 11</font> 
<font color='000000'> }</font> 
<font color='000000'> {</font> 
<font color='404040'> 11</font> 
<font color='000000'> }</font> 
<font color='000000'> {</font> 
<font color='404040'> 12</font> 
<font color='989898'> 13</font> 
<font color='000000'> }</font> 
<BR> 
<font color='000000'> TOTAL LEN=</font> 
<font color='000000'> 10</font> 
<BR> 
<BR> 
</b></font></html> 

в этом случае, я хочу, чтобы извлечь следующее:

{1,} {2,3,} {4,5,} 
{9,10,} {11,} {12,13,} 

Вот некоторые код, который я попробовал, но ни один из м работал:

# First try 
soup = BeautifulSoup('file:///H:/Approx_google_code/tiny20.html') 
soup.findall('PATTERN:') 

# Second try 
re.search("PATTERN:", 'file:///H:/Approx_google_code/tiny20.html') 

# Third try 
soup.body.findAll(text='PATTERN:') 

# Forth try 
soup.body.findAll(text=re.compile('PATTERN:')) 

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

Я попробовал пример от Why does bs4 return tags and then an empty list to this find_all() method?, но не дал результатов.

+0

Что ваш выход выглядеть? – Steven

+0

'soup.find_all (lambda e: 'PATTERN' в e.text)' будет работать; аргумент 'text' работает только в том случае, если в теге нет других элементов *. –

+0

Ваш HTML в противном случае плохо искажен; элемент '' не имеет закрывающего элемента '', например. –

ответ

1

Найдите элемент, содержащий PATTERN: текст, найти font родителей и получить следующий font родственный элемент:

soup = BeautifulSoup(data) 

for elm in soup.find_all(text="PATTERN:"): 
    print elm.find_parent("font").find_next_sibling("font").get_text(strip=True) 

Демо:

>>> from bs4 import BeautifulSoup 
>>> 
>>> data = """ 
... <! Created by program ApproxMAP by Hye-Chung(Monica) Kum> 
... <HTML><font size=5 face='Helvetica-Narrow'><b> 
... <font color='000000'> Cluster Support= [Pattern=</font> 
... <font color='000000'> 50</font> 
... <font color='000000'> % : Variation=</font> 
... <font color='000000'> 20</font> 
... <font color='000000'> %]; Database Support= [Min= </font> 
... <font color='000000'> 1</font> 
... <font color='000000'> seq: Max=</font> 
... <font color='000000'> 50</font> 
... <font color='000000'> %]</font> 
... <BR> 
... <font color='a9a9a9'> cluster=0 size=3</font> 
... <font color='000000'> =<100:</font> 
... <font color='434343'> 85:</font> 
... <font color='767676'> 70:</font> 
... <font color='a9a9a9'> 50:</font> 
... <font color='c8c8c8'> 35:</font> 
... <font color='e1e1e1'> 20></font> 
... <BR> 
... <font color='000000'> <u>PATTERN:</font> 
... <font color='000000'> {1,} {2,3,} {4,5,} 
... </font> 
... <font color='000000'> =</font> 
... <font color='000000'> 5</font> 
... <font color='000000'> </u></font> 
... <BR> 
... <font color='000000'> {</font> 
... <font color='000000'> 1</font> 
... <font color='cbcbcb'> 12</font> 
... <font color='000000'> }</font> 
... <font color='000000'> {</font> 
... <font color='cbcbcb'> 24</font> 
... <font color='000000'> }</font> 
... <font color='000000'> {</font> 
... <font color='7f7f7f'> 2</font> 
... <font color='7f7f7f'> 3</font> 
... <font color='cbcbcb'> 25</font> 
... <font color='000000'> }</font> 
... <font color='000000'> {</font> 
... <font color='cbcbcb'> 1</font> 
... <font color='7f7f7f'> 4</font> 
... <font color='7f7f7f'> 5</font> 
... <font color='000000'> }</font> 
... <font color='000000'> {</font> 
... <font color='cbcbcb'> 26</font> 
... <font color='000000'> }</font> 
... <BR> 
... <font color='000000'> <u>PATTERN:</font> 
... <font color='000000'> {9,10,} {11,} {12,13,} 
... </font> 
... <font color='000000'> =</font> 
... <font color='000000'> 5</font> 
... <font color='000000'> </u></font> 
... <BR> 
... <font color='000000'> {</font> 
... <font color='717171'> 9</font> 
... <font color='989898'> 10</font> 
... <font color='000000'> }</font> 
... <font color='000000'> {</font> 
... <font color='d3d3d3'> 11</font> 
... <font color='000000'> }</font> 
... <font color='000000'> {</font> 
... <font color='404040'> 11</font> 
... <font color='000000'> }</font> 
... <font color='000000'> {</font> 
... <font color='404040'> 12</font> 
... <font color='989898'> 13</font> 
... <font color='000000'> }</font> 
... <BR> 
... <font color='000000'> TOTAL LEN=</font> 
... <font color='000000'> 10</font> 
... <BR> 
... <BR> 
... </b></font></html> 
... """ 
>>> 
>>> soup = BeautifulSoup(data) 
>>> 
>>> for elm in soup.find_all(text="PATTERN:"): 
...  print elm.find_parent("font").find_next_sibling("font").get_text(strip=True) 
... 
{1,} {2,3,} {4,5,} 
{9,10,} {11,} {12,13,} 

Обратите внимание, что, так как у меня lxml установлены, BeautifulSoup использования это как основной парсер. Я тоже пробовал с html.parser, и это сработало для меня. html5lib не работает как предыдущие два. Во всяком случае, указать анализатору явно:

soup = BeautifulSoup(data, "lxml") 

или:

soup = BeautifulSoup(data, "html.parser") 
+0

Hi alecxe, я попробовал ваш код и попытался указать парсер, но я ничего не получил для вывода. – datadatadata

+0

@ Kyala в порядке, попробуйте найти решение в теме, помеченной как дубликат. Удачи! – alecxe

+0

Большое вам спасибо! – datadatadata

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