не могу получить <span></span> тексты - PullRequest
0 голосов
/ 01 июня 2018

не может получить текст span внутри "таблицы", спасибо!

from bs4 import BeautifulSoup
import urllib2

url1 = "url"

content1 = urllib2.urlopen(url1).read()
soup = BeautifulSoup(content1,"lxml")
table = soup.findAll("div", {"class" : "iw_component","id":"c1417094965154"})
rows = table.find_all('span',recursive=False)
for row in rows:
    print(row.text)

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

table = soup.findAll("div", {"class" : "iw_component","id":"c1417094965154"})

В приведенной выше строке findAll() возвращает список.Итак, в следующей строке вы получаете сообщение об ошибке, поскольку оно ожидает строку HTML.

Если вы ожидаете только одну таблицу, попробуйте использовать следующий код.Просто замените

rows = table.find_all('span',recursive=False)

на

rows = table[0].find_all('span')

Если вы ожидаете, что на странице будет несколько таблиц, запустите цикл для таблицы изатем выполните остальные операторы внутри цикла for.

Кроме того, для красивого вывода вы можете заменить tabs пробелами, как в следующем коде:

row = row.get_text()
row = row.replace('\t', '')
print(row)

Finalрабочий код для вас:

from bs4 import BeautifulSoup
import urllib2

url1 = "url"

content1 = urllib2.urlopen(url1).read()
soup = BeautifulSoup(content1,"lxml")
table = soup.findAll("div", {"class" : "iw_component","id":"c1417094965154"})
rows = table[0].find_all('span')
for row in rows:
    row_str = row.get_text()
    row_str = row_str.replace('\t', '')
    print(row_str)

Относительно параметра recursive=False, если он установлен в false, он найдет только у прямых потомков, которые в вашем случае не дадут результата.

Рекурсивный аргумент в find ()

Если вы хотите, чтобы Beautiful Soup рассматривал только прямых детей, вы можете передать recursive=False

0 голосов
/ 01 июня 2018

Вот еще один подход, использующий lxml вместо Beautifulsoup:

import requests
from lxml import html

req = requests.get("<URL>")
raw_html = html.fromstring(req.text)
spans = raw_html.xpath('//div[@id="c1417094965154"]//span/text()')
print("".join([x.replace("\t", "").replace("\r\n","").strip() for x in spans]))

Вывод: одновременные трансляции Kranji Mile Day, ипподром Kranji, SINClass 3 Handicap - 1200M TURFSaturday, 26 мая 2018Race 1, 17:15 PM

Как видите, выходные данные нуждаются в небольшом форматировании, spans - это список всех текстов span, поэтому вы можете выполнять любую необходимую обработку.

0 голосов
/ 01 июня 2018

Вы, кажется, используете python 2.x, вот решение для python 3.x, так как в настоящее время у меня нет среды python 2.x:

from bs4 import BeautifulSoup
import urllib.request as urllib


url1 = "<URL>"

# Read the HTML page
content1 = urllib.urlopen(url1).read()
soup = BeautifulSoup(content1, "lxml")

# Find the div (there is only one, so you do not need findAll) -> this is your problem
div = soup.find("div", class_="iw_component", id="c1417094965154")
# Now you retrieve all the span within this div
rows = div.find_all("span")

# You can do what you want with it !
line = ""
for row in rows:
    row_str = row.get_text()
    row_str = row_str.replace('\t', '')
    line += row_str + ", "
print(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...