2016-06-22 3 views
-2

У меня есть большая строка - html-страница. Мне нужно найти все имена флеш-накопителей, i.e. Мне нужно получить контент между двойными кавычками: data-name="USB Flash-drive Leef Fuse 32Gb">. Поэтому мне нужна строка между data-name=" и ">. Пожалуйста, не упоминайте BeautifulSoup, мне нужно сделать это без BeautifulSoup и лучше без регулярных выражений, но регулярное выражение также принимается.Python. Как найти все вхождения подобранной подстроки?

Я пытался использовать это:

p = re.compile('(?<=")[^,]+(?=")') 
result = p.match(html_str) 
print(result) 

но результат нет. Но regex101.com он работал: enter image description here

+0

Что не так с использованием парсера DOM в HTML для извлечения значения атрибута? –

+0

@ Vasili Syrakis У меня есть определенная задача - сделать это с помощью python. –

+0

fyi bs4 = python; см. первый абзац этой ссылки: https://www.crummy.com/software/BeautifulSoup/bs4/doc/ –

ответ

2

py2: https://docs.python.org/2/library/htmlparser.html

PY3: https://docs.python.org/3/library/html.parser.html


from html.parser import HTMLParser 

class MyHTMLParser(HTMLParser): 
    def handle_starttag(self, tag, attrs): 
     # tag = 'sometag' 
     for attr in attrs: 
      # attr = ('data-name', 'USB Flash-drive Leef Fuse 32Gb') 
      if attr[0] == 'data-name': 
       print(attr[1]) 

parser = MyHTMLParser() 
parser.feed('<sometag data-name="USB Flash-drive Leef Fuse 32Gb">hello world</sometag>') 

Выходные:

USB Flash-drive Leef Fuse 32Gb 

Я добавил некоторые комментарии к коду sh вы, какая структура данных возвращается парсером.

Это должно быть очень легко построить отсюда.

Просто введите HTML, и он будет разбирать его в порядке. Обратитесь к документам и продолжайте попытки.

+0

Большое спасибо, да благословит вас Бог. –

0

Если вы хотите сделать это с основной строкой питона разборе здесь способ

s="html string" 
start = s.find('data-name="') 
end = s.find('">') 
output = s[start:end] 

Это то, что происходит в моей оболочке Python

>>> s='junk...data-name="USB Flash-drive Leef Fuse 32Gb">...junk' 
>>> start = s.find('data-name="') 
>>> end = s.find('">') 
>>> output = s[start:end] 
>>> output 
'data-name="USB Flash-drive Leef Fuse 32Gb' 

дайте мне знать, если эта часть сценария работы отдельно

+0

не работает, выход пуст –

+0

Ваш пример работает, но не с моей большой html-строкой –

+0

iif вы все еще после альтернативного решения, можете ли вы вставить свою длинную строку html для проверки – user3404344

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