Python 刮削<;span>;流文本</span>;使用BeautifulSoup和urllib

Python 刮削<;span>;流文本</span>;使用BeautifulSoup和urllib,python,web-scraping,beautifulsoup,urllib,Python,Web Scraping,Beautifulsoup,Urllib,我正在使用BeautifulSoup从网站上抓取数据。无论出于何种原因,我似乎无法找到一种方法来打印span元素之间的文本。这是我正在运行的 data = """ <div class="grouping"> <div class="a1 left" style="width:20px;">Text</div> <div class="a2 left" style="width:30px;"><span id=

我正在使用BeautifulSoup从网站上抓取数据。无论出于何种原因,我似乎无法找到一种方法来打印span元素之间的文本。这是我正在运行的

data = """ <div class="grouping">
     <div class="a1 left" style="width:20px;">Text</div>
     <div class="a2 left" style="width:30px;"><span 
     id="target_0">Data1</span>
   </div>
   <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2
   </span></div>
   <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3
   </span</div>
</div>
"""
当我使用urllib时,它会产生以下结果:

<span id="target_0"></span>, 
<span id="target_4"></span>, 
<span id="target_5"></span>, 
,
, 
, 
但是,我也下载了html文件,当我解析下载的文件时,它会生成以下输出(我想要的输出):

Data1,Data1
数据1,数据1
数据1,数据1
有人能解释一下为什么urllib不能产生结果吗?

使用以下代码:

...
soup = BeautifulSoup(html, 'html.parser')

your_data = list()

for line in soup.findAll('span', attrs={'id': 'target_0'}):
    your_data.append(line.text)


...
同样地,添加所有
类属性
,您需要从中提取数据并将
您的_数据
列表写入csv文件。希望这将有助于如果这不起作用。让我知道。

使用以下代码:

...
soup = BeautifulSoup(html, 'html.parser')

your_data = list()

for line in soup.findAll('span', attrs={'id': 'target_0'}):
    your_data.append(line.text)


...

同样地,添加所有
类属性
,您需要从中提取数据并将
您的_数据
列表写入csv文件。希望这将有助于如果这不起作用。让我知道。

您可以使用以下方法根据显示的源HTML创建列表:

from bs4 import BeautifulSoup

data = """ 
<div class="grouping">
     <div class="a1 left" style="width:20px;">Text0</div>
     <div class="a2 left" style="width:30px;"><span id="target_0">Data1</span></div>
     <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div>
     <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div>
</div>

<div class="grouping">
     <div class="a1 left" style="width:20px;">Text2</div>
     <div class="a2 left" style="width:30px;"><span id="target_2">Data1</span></div>
     <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div>
     <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div>
</div>

<div class="grouping">
     <div class="a1 left" style="width:20px;">Text4</div>
     <div class="a2 left" style="width:30px;"><span id="target_4">Data1</span></div>
     <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div>
     <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div>
</div>
"""

soup = BeautifulSoup(data, "lxml")

search_ids = [0, 4, 5] # list of Target IDs to scrape

for i in search_ids:
    span = soup.find("span", id='target_{}'.format(i))

    if span:
        grouping = span.parent.parent
        print list(grouping.stripped_strings)[:-1]      # -1 to remove "Data3"

注意,如果您从URL返回的HTML与从浏览器查看源代码时看到的HTML不同(即,您想要的数据完全丢失),则您需要使用解决方案,如
selenium
,连接到浏览器并提取HTML。这是因为在这种情况下,HTML可能是通过Javascript在本地生成的,
urllib
没有Javascript处理器。

您可以使用以下方法基于显示的源HTML创建列表:

from bs4 import BeautifulSoup

data = """ 
<div class="grouping">
     <div class="a1 left" style="width:20px;">Text0</div>
     <div class="a2 left" style="width:30px;"><span id="target_0">Data1</span></div>
     <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div>
     <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div>
</div>

<div class="grouping">
     <div class="a1 left" style="width:20px;">Text2</div>
     <div class="a2 left" style="width:30px;"><span id="target_2">Data1</span></div>
     <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div>
     <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div>
</div>

<div class="grouping">
     <div class="a1 left" style="width:20px;">Text4</div>
     <div class="a2 left" style="width:30px;"><span id="target_4">Data1</span></div>
     <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div>
     <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div>
</div>
"""

soup = BeautifulSoup(data, "lxml")

search_ids = [0, 4, 5] # list of Target IDs to scrape

for i in search_ids:
    span = soup.find("span", id='target_{}'.format(i))

    if span:
        grouping = span.parent.parent
        print list(grouping.stripped_strings)[:-1]      # -1 to remove "Data3"

注意,如果您从URL返回的HTML与从浏览器查看源代码时看到的HTML不同(即,您想要的数据完全丢失),则您需要使用解决方案,如
selenium
,连接到浏览器并提取HTML。这是因为在这种情况下,HTML可能是通过Javascript在本地生成的,
urllib
没有Javascript处理器。

给出要解析的站点的真实URL,请输入要解析的站点的真实URL,请点击!这适用于第一个类(不适用于a),但不适用于其他两个类。但是,当我将网页下载到.html文件并解析该文件时,我没有这个问题。你有没有想过为什么会这样?否则,我想我可以试着解析div的子元素,并在那里进行分析,对吗?我更新了
data1
文本的代码。先试试这个@火影忍者谢谢!这适用于第一个类(不适用于a),但不适用于其他两个类。但是,当我将网页下载到.html文件并解析该文件时,我没有这个问题。你有没有想过为什么会这样?否则,我想我可以试着解析div的子元素,并在那里进行分析,对吗?我更新了
data1
文本的代码。首先试试@naruto有没有办法检查HTML或CSS以确定数据是否由javascript计算?或者你需要看JS吗?我使用GoogleChromeInspect元素来读取HTML/CSS。是否有更好的应用程序来检查元素?就像我说的,数据出现在“inspect元素”上,当我下载html文件并用BS解析它时,但是urllib似乎无法从网站上读取。如果您在浏览器中看到的HTML源与打印urllib或请求库返回的内容(例如)时看到的源不匹配,则可能是Javascript。基于selenium的解决方案只会在脚本中添加几行。是否有方法检查HTML或CSS以确定数据是否由javascript计算?或者你需要看JS吗?我使用GoogleChromeInspect元素来读取HTML/CSS。是否有更好的应用程序来检查元素?就像我说的,数据出现在“inspect元素”上,当我下载html文件并用BS解析它时,但是urllib似乎无法从网站上读取。如果您在浏览器中看到的HTML源与打印urllib或请求库返回的内容(例如)时看到的源不匹配,则可能是Javascript。基于硒的解决方案只会在脚本中添加几行。
[u'Text0', u'Data1', u'Data2']
[u'Text4', u'Data1', u'Data2']