Разложение HTML для ссылки на текст и цель
Учитывая ссылку HTML, например
<a href="urltxt" class="someclass" close="true">texttxt</a>
как я могу выделить URL и текст?
Обновление
Я использую Beautiful Soup и не могу понять, как это сделать.
Я сделал
soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))
links = soup.findAll('a')
for link in links:
print "link content:", link.content," and attr:",link.attrs
я получаю
*link content: None and attr: [(u'href', u'_redirectGeneric.asp?genericURL=/root /support.asp')]* ...
...
Почему мне не хватает содержимого?
edit: выработано "застряло" в соответствии с рекомендациями:)
Ответы
Ответ 1
Используйте Beautiful Soup. Выполнение этого самого сложнее, чем кажется, вам будет лучше использовать проверенный и проверенный модуль.
EDIT:
Я думаю, вы хотите:
soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read())
Кстати, это плохая идея попробовать открыть URL-адрес там, как если бы он поступил неправильно, он может стать уродливым.
ИЗМЕНИТЬ 2:
Это должно показать вам все ссылки на странице:
import urlparse, urllib
from BeautifulSoup import BeautifulSoup
url = "http://www.example.com/index.html"
source = urllib.urlopen(url).read()
soup = BeautifulSoup(source)
for item in soup.fetchall('a'):
try:
link = urlparse.urlparse(item['href'].lower())
except:
# Not a valid link
pass
else:
print link
Ответ 2
Вот пример кода, показывающий получение атрибутов и содержимого ссылок:
soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))
for link in soup.findAll('a'):
print link.attrs, link.contents
Ответ 3
Похоже, у вас есть два вопроса:
- link.content s, а не link.content
- attrs - это словарь, а не строка. Он содержит пары ключевых значений для каждого атрибута в элементе HTML. link.attrs ['href'] предоставит вам то, что вы ищете, но вы хотите обернуть это при проверке, если вы столкнетесь с тегом без атрибута href.
Ответ 4
Хотя я полагаю, что другие могут быть правильны, указывая на использование Beautiful Soup, они могут и не быть, и использование внешней библиотеки может быть массово поверх ваших целей. Вот регулярное выражение, которое будет делать то, что вы просите.
/<a\s+[^>]*?href="([^"]*)".*?>(.*?)<\/a>/
Здесь он соответствует:
'<a href="url" close="true">text</a>'
// Parts: "url", "text"
'<a href="url" close="true">text<span>something</span></a>'
// Parts: "url", "text<span>something</span>"
Если вы хотите получить только текст (например, "textomething" во втором примере выше), я просто запустил бы еще одно регулярное выражение, чтобы удалить что-либо между заостренными скобками.