Ruby 如何使用Nokogiri从结构不良的HTML中获取特定项目

Ruby 如何使用Nokogiri从结构不良的HTML中获取特定项目,ruby,web-scraping,nokogiri,Ruby,Web Scraping,Nokogiri,我正在使用Nokogiri抓取事件列表的“”,但该页面或多或少都是一块内容。我似乎无法使用以下方法访问带有class=“news”的特定h3项目: def scrape_百老汇_书籍 基本url=”https://broadwaybookshophackney.com" slug=“/events/?event=archive” url=base\u url+slug unparsed_page=HTTParty.get(url) 解析的页面=Nokogiri::HTML(未解析的页面) 事件列

我正在使用Nokogiri抓取事件列表的“”,但该页面或多或少都是一块内容。我似乎无法使用以下方法访问带有
class=“news”
的特定
h3
项目:

def scrape_百老汇_书籍
基本url=”https://broadwaybookshophackney.com"
slug=“/events/?event=archive”
url=base\u url+slug
unparsed_page=HTTParty.get(url)
解析的页面=Nokogiri::HTML(未解析的页面)
事件列表=已解析的页面。在css(“div内容”)
#捆绑,撬动
events=Array.new
事件列表。每个do项目|
放置item.css(“h3.news”).text
结束
结束
这给了我一个错误:

undefined method `css' for ["id", "content"]:Array (NoMethodError)
如果我尝试迭代
事件列表
我仍然只会在数据文件中写入一个事件:

events_list=parsed_page.css(“div#content”)
events=Array.new
事件列表。每个带有索引do的事件,索引|
事件={
索引:索引,,
标题:event.css(“h3.news”).text
}
事件
at_css
。这将是不可忍受的;当你尝试迭代它时,你会得到div的属性。如果你想得到一个要迭代的元素列表,可以使用
parsed_page.css(“div#content”)

或者更简洁地说:

events = parsed_page.css("div#content h3.news").map(&:text)

使用了这一点重构,您也可以考虑将该方法重构一点,以便您的URL获取和文档解析是可重用的,这将清理您的<代码> PureSyBulyWooWoo> <代码>:一个单独的职责:

def scrape_broadway_books
  doc = doc_from_url("https://broadwaybookshophackney.com",
    "/events/?event=archive")
  doc.css("div#content h3.news").map(&:text)
end

def doc_from_url(*parts)
  uri = URI.join(*parts)
  Nokogiri::HTML(HTTParty.get(uri))
end

感谢您的快速响应,但它似乎只包含一项内容。我将在OP中添加一些额外的代码来解释.div#content只找到一个div。在该div中,有多个
h3.news
event.css(“h3.news”).text
只获取第一个匹配的
h3.news
的文本。只需搜索并迭代
.css(“div#content h3.news”)
并从每个项目构建一个事件-无需在循环中执行另一个
.css
搜索。如果这些问题很明显,很抱歉。。。因此,使用您的示例
events=parsed_page.css(“h3.news,p.pub”).map(&:text)
为我提供了一个标题和日期数组,但每个事件标题及其日期都没有在数组中分组。这是编写正确的
#map
块的问题吗?谢谢。这将更加棘手,因为日期位于H3的同级
p.pub strong
标记中。您必须迭代h3元素的列表,然后从每个元素中获取下一个同级元素,然后从中提取日期。