Разложение HTML для ссылки на текст и цель - PullRequest
5 голосов
/ 13 ноября 2008

Учитывая ссылку 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')]*  ...
...

Почему я пропускаю контент?

редактировать: уточнено «застрял» в соответствии с рекомендациями:)

Ответы [ 4 ]

8 голосов
/ 13 ноября 2008

Использование Красивый суп . Делать это самостоятельно сложнее, чем кажется, вам лучше использовать проверенный и проверенный модуль.

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
6 голосов
/ 13 ноября 2008

Вот пример кода, показывающий получение атрибутов и содержимого ссылок:

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))
for link in soup.findAll('a'):
    print link.attrs, link.contents
4 голосов
/ 13 ноября 2008

Похоже, у вас есть две проблемы:

  1. link.content s , не link.content
  2. attrs - это словарь, а не строка. Он содержит пары ключ-значение для каждого атрибута в элементе HTML. link.attrs ['href'] даст вам то, что вы, похоже, ищете, но вы захотите обернуть это в проверку, если вы встретите тег без атрибута href.
3 голосов
/ 13 ноября 2008

Хотя я полагаю, что другие могут быть правы, указав вам на использование 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>"

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

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