无法获得<span> </span>文本

时间:2018-06-01 08:10:02

标签: python beautifulsoup

无法在“表格”中获取范围文本,谢谢!

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 :(得分:2)

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循环,然后在for循环中运行其余语句。

此外,对于漂亮的输出,您可以使用空格替换tabs,如下面的代码所示:

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

最终的工作代码是:

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,则只会在直接子项中找到,在您的情况下,它将不会给出任何结果。

Recursive Argument in find()

  

如果你只想要美丽的汤来考虑直接孩子,你可以传递recursive=False

答案 1 :(得分:1)

你似乎使用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)

答案 2 :(得分:1)

这是使用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让分 - 1200M TURFS星期六,2018年5月26日第1区,下午5:15

如您所见,输出需要一点格式化,spans是所有跨度文本的列表,因此您可以进行所需的任何处理。