Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy-使用CSS查找可能包含不同子元素的元素_Python_Css_Scrapy - Fatal编程技术网

Python Scrapy-使用CSS查找可能包含不同子元素的元素

Python Scrapy-使用CSS查找可能包含不同子元素的元素,python,css,scrapy,Python,Css,Scrapy,我使用Scrapy搜索与政治事件相关的一些数据字段:名称、时间、数据和位置。我意识到位置字段的HTML使用两种不同的格式: <li class="eventlist-meta-item eventlist-meta-address event-meta-item"> 2168 Rayburn House Office Building </li> 问题是,在80个事件中,76个使用格式1,4个使用格式2,所以我得到80个事件,但只有76个地址。我希望能够以类似于

我使用Scrapy搜索与政治事件相关的一些数据字段:名称、时间、数据和位置。我意识到位置字段的HTML使用两种不同的格式:

<li class="eventlist-meta-item eventlist-meta-address event-meta-item">
    2168 Rayburn House Office Building
</li>

问题是,在80个事件中,76个使用格式1,4个使用格式2,所以我得到80个事件,但只有76个地址。我希望能够以类似于#1的单行格式获得使用上述格式#2的多行地址。从今天早上开始,我对Scrapy还不熟悉,我想知道:“我如何使用Scrapy查找下面有span标记的地址元素,以便将它们组合成一行地址?”

也许可以尝试使用属性
[attr]
或通配符选择器
*
?由于这两种格式在类为
eventlist元地址-*
的元素中都包含文本,因此可以使用
[class*=“eventlist元地址”]::text
或仅
。eventlist元地址*::text

来自parsel导入选择器的

def extract_地址(sel:选择器)->str:
#这个也行
#metas=s.css('.eventlist元地址*::text').getall()
metas=s.css('[class*=“eventlist元地址”]::text')。getall()
返回“”。如果m.strip(),则连接(m.strip()表示元中的m)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
format1=''
  • 2168雷伯恩大厦办公楼
  • ''' format2=''
  • 圣。 华盛顿特区,20002年 美国
  • ''' 对于[format1,format2]中的f: s=选择器(f) 打印(摘录地址)
    输出:

    2168 Rayburn House Office Building
    A St. Washington, DC, 20002 United States
    

    您是否尝试过
    addresses=''.join(选择器(…).css('..事件列表元地址行::文本').getall())
    ?感谢您的回复“加入”实际上并不能完全满足我的需要。让我看看是否能更好地解释这个问题。当我执行getall()获取地址时,我丢失了上面格式为#2的地址,因为这些地址位于span标记内,而格式为#1。我的问题是:我能根据元素是否包含子元素动态地刮取元素吗?啊,我明白了。看到我的答案了吗?你的意思是
    定义我的函数(参数:参数类型)->返回类型:
    ?它被称为类型注释,主要用于帮助编辑器/IDE自动完成代码。您可以删除它,当然,它对代码没有任何影响。
    events = Selector(response=response).css('div.eventlist-column-info a.eventlist-title-link::text').getall()
    addresses = Selector(response=response).css('div.eventlist-column-info li.eventlist-meta-item.eventlist-meta-address::text').getall()
    
    2168 Rayburn House Office Building
    A St. Washington, DC, 20002 United States