Как извлечь неуказанные ссылки из HTML в BeautifulSoup?

1

Я не нашел хорошего ответа на вопрос об извлечении ссылок из HTML-документа. Я видел несколько ответов, где вы указываете ссылку напрямую. Однако, что, если вы хотите извлечь неуказанный url? Мне просто интересно, возможно ли это. У меня есть этот HTML здесь

Я положил это в Pycharm

html = """
<
<html>
<head>
    <title>About me</title>

</head>

<body>
<h1>About Me</h1>

<h4>My Hobbies</h4>
<a href="http://www.google.com"> hello world </a>
<a href="http://www.nytimes.com">byeworld </a>

<ul>
    <li>Cooking</li>
    <li>Gym</li>
    <li>Code</li>
</ul>
</body>
</html> """

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
print(soup.get_text())

#<html>
#<head>
#   <title>About me</title>
#</head>
#<body>
#<h1>About Me</h1>
#<h4>My Hobbies</h4>
# <a href="http://www.google.com"> hello world </a>
# <a href="http://www.nytimes.com">byeworld </a>
#<ul>
#   <li>Cooking</li>
#   <li>Gym</li>
#   <li>Code</li>
#</ul>
#</body>
#</html>

Я получаю вывод:

About me


About Me
My Hobbies


Cooking
Gym
Code

Каковы основы того, что я хочу, но я хочу, чтобы он извлекал оба URL, а также в виде обычного текста.

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

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
for link in soup.find_all('a', href=True):
print(link['href'])
print(soup.get_text())

А также

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
soup.find_all("a")
    for link in soup.final_all('a'):
print(link.get('href'))
print(soup.get_text())

Я просто очень запутался в том, как это сделать. Если кто-то может помочь?

Теги:
beautifulsoup
urllib2

2 ответа

0

Ваш код почти нормально. Для выбора всех тегов <a> с атрибутом href вы можете использовать селектор CSS soup.select('a[href]'). Затем просто перебирайте найденные элементы и печатайте URL-адреса и текст внутри них:

html = """<html>
<head>
    <title>About me</title>

</head>

<body>
<h1>About Me</h1>

<h4>My Hobbies</h4>
<a href="http://www.google.com"> hello world </a>
<a href="http://www.nytimes.com">byeworld </a>

<ul>
    <li>Cooking</li>
    <li>Gym</li>
    <li>Code</li>
</ul>
</body>
</html> """

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

print([(a['href'], a.text.strip()) for a in soup.select('a[href]')])

Печать:

[('http://www.google.com', 'hello world'), ('http://www.nytimes.com', 'byeworld')]
0

Первый кусок кода должен работать до тех пор, пока вы отступаете код после цикла for. В python отступы - это то, как вы указываете блоки кода, так что все отступы в точности на одну вкладку больше, чем цикл for будет запускаться каждый раз, когда цикл повторяется.

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
for link in soup.find_all('a', href=True):
    print(link['href'])
print(soup.get_text())

Должен печатать:

http://www.google.com
http://www.nytimes.com

<


About me


About Me
My Hobbies
 hello world
byeworld

Cooking
Gym
Code

Обратите внимание, что у вас есть дополнительный < в вашем html.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню