BeatifulSoup и одинарные кавычки в атрибутах - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь прочитать HTML-страницу и получить от нее некоторую информацию.В одной из строк мне нужна информация внутри атрибута alt изображения.вот так:

<img src='logo.jpg' alt='info i need'>

Проблема в том, что при синтаксическом анализе beautifulsoup окружает содержимое alt двойными кавычками вместо использования уже существующих одинарных кавычек.Из-за этого результат выглядит примерно так:

<img alt="\'info" i="" need="" src="\'logo.jpg\'"/>

В настоящее время мой код состоит в следующем:

name = row.find("td", {"class": "logo"}).find("img")["alt"]

, который должен возвращать «необходимую мне информацию», но в настоящее время возвращает »\ "инфо" Что я могу делать не так?Есть ли какие-либо настройки, которые мне нужно изменить, чтобы BeautifulSoup правильно проанализировал это?

Редактировать: мой код выглядит примерно так (я тоже использовал стандартный html-парсер, но без разницы)

import sys
import urllib.request
import time
from html.parser import HTMLParser
from bs4 import BeautifulSoup

def main():     
    url = 'https://myhtml.html'
    with urllib.request.urlopen(url) as page:
        text = str(page.read())
        html = BeautifulSoup(page.read(), "lxml")

        table = html.find("table", {"id": "info_table"})
        rows = table.find_all("tr")

        for row in rows:
            if row.find("th") is not None:
                continue
            info = row.find("td", {"class": "logo"}).find("img")["alt"]
            print(info) 


if __name__ == '__main__':
    main()

и html:

<div class="table_container">
<table class="info_table" id="info_table">
<tr>
   <th class="logo">Important infos</th>
   <th class="useless">Other infos</th>
</tr>
<tr >
   <td class="logo"><img src='Logo.jpg' alt='info i need'><br></td>
   <td class="useless">
      <nobr>useless info</nobr>
   </td>
</tr>
<tr >
   <td class="logo"><img src='Logo2.jpg' alt='info i need too'><br></td>
   <td class="useless">
      <nobr>useless info</nobr>
   </td>
</tr>

1 Ответ

0 голосов
/ 16 октября 2018

Извините, я не могу добавить комментарий.

Я проверил ваш случай, и для меня вывод выглядит правильным.

HTML:

<html>
    <body>
        <td class="logo">
            <img src='logo.jpg' alt='info i need'>
        </td>
    </body>
</html>

Python:

from bs4 import BeautifulSoup

with open("myhtml.html", "r") as html:
    soup = BeautifulSoup(html, 'html.parser')
    name = soup.find("td", {"class": "logo"}).find("img")["alt"]
    print(name)

Возвращает:

info i need

Я думаю, что ваша проблема - это проблема кодирования при записи файла обратно в html.

Пожалуйста, предоставьте полный код и далееинформация.

  • html
  • ваш код Python

Обновление:

Я проверил ваш код, ваш код не работаетвообще: / После переделки я смог получить требуемый вывод в результате.

import sys
import urllib.request
import time
from html.parser import HTMLParser
from bs4 import BeautifulSoup

def main():     
    url = 'https://code.mytesturl.net'
    with urllib.request.urlopen(url) as page:

        soup = BeautifulSoup(page, "html.parser")
        name = soup.find("td", {"class": "logo"}).find("img")["alt"]
        print(name)


if __name__ == '__main__':
    main()

Возможные проблемы:
Может быть, ваш парсер должен быть html.parser
Версия Python / bs версия?

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