0

我是网络抓取的新手,请原谅我的术语可能含糊不清:|

我正在尝试为其编写蜘蛛的 HTML 页面片段:

<h3>2019 General Meetings</h3>
<p><strong>Group 20:</strong> <br />Wednesday, June 5, 9 a.m. <br /> Bank &amp; Trust, 10000 E. Western Ave.</p>
<p>Wednesday, July 11, 9 a.m. <br />Bank &amp; Trust, 10000 E. Western Ave.</p>
<p><strong>Group 20:</strong> <br />Monday, July 8, 9 a.m.<br />Hubbard, 1740 W. 199th St.</p>
<p>&nbsp;</p></div>

我试图遵循的逻辑是:
我有 <h3> 这是“顶级”(或者至少我认为它是),页面上还有其他 h3,所以我需要确保只有这个<h3> 被传递给以下解析器。

对于上述情况,我正在使用

response_items = response.xpath("//h3[contains(@h3, 'General Meetings')]") 

而且我认为我有它的工作。(但需要更多测试才能确定。)

我需要将每个 <p> 传递给类中的相应解析器,并且每个都应返回有关会议的所需信息,例如 _parser_date将返回日期,_parser_address将返回地址,然后继续。

我无法为此找到正确的scrapy/xpath语法。在https://docs.scrapy.org/en/latest/topics/selectors.html之后,我无法让它很好地工作。

我对每个解析器特别感兴趣,以“拾取”它要解析的 <p> 中的模式,如果它是日期模式,则对其进行格式化,然后返回。如果它是一个位置模式......等等。

我试图避免使用re.(),除非您建议在这里这样做是正确的。任何见解都将受到欢迎,谢谢。

4

1 回答 1

1

这应该有效:

for p_node in response.xpath('//h3[contains(., 'General Meetings')]/following-sibling::p[position() < last()]'):
    address = p_node.xpath('./text()[last()]).get()
    date = p_node.xpath('./text()[last() - 1]).get()

我曾经position() < last()跳过最后一个空<p>,并且我正在从最后解析数据。

于 2020-11-02T12:01:17.793 回答