无法在“表格”中获取范围文本,谢谢!
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)
答案 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=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是所有跨度文本的列表,因此您可以进行所需的任何处理。